2개 이상의 파일로 구성된 열 병합 및 추가

2개 이상의 파일로 구성된 열 병합 및 추가

그림과 같은 내용이 포함된 "N"개의 파일이 있고 다섯 번째 열을 병합하고 추가하고 싶습니다.

파일은 탭으로 구분됩니다.

위 스크린샷에 표시된 내용이 포함된 "N"개의 파일이 있습니다. 나는 그것들을 병합하고 다섯 번째 열을 추가하고 싶습니다. 처음 4개 열은 동일합니다.

awk파일 1과 2에 대해 다음 명령을 사용해 보았습니다 .

awk 'NR==FNR{a[NR]=$0;next} {print a[FNR] "\t",$5}' file1 file2

2개 이하의 파일만 추가합니다.

또는 다른 도구를 사용하여 awk이를 올바르게 수행하려면 어떻게 해야 합니까 paste?

답변1

처음 4개의 열이 파일에서 동일하면 다음과 같은 명령을 실행할 수 있습니다.

set -- file*
fields="-f-5,$(seq -s, 10 5 $((5*$#)))"
paste "$@" | cut ${fields%?} >outfile

paste이렇게 하면 모든 파일에 대해 필드 1-5와 그 이후의 5개 필드마다 추출 됩니다 .

답변2

테스트되지 않음:

awk -F "\t" '
    { key = $1 FS $2 FS $3 FS $4; values[key] = values[key] FS $5 }
    END { for (key in values) print key values[key] }
' file ...

제목

각 파일에 대해 파일 이름의 일부를 추출하여 제목으로 사용하려고 합니다. 헤더를 추적하고 이를 각 파일에 추가하기 위해 별도의 문자열을 사용합니다.

awk -F "\t" '
    BEGIN { header = "col1" FS "col2" FS "col3" FS "col4" }
    { 
        key = $1 FS $2 FS $3 FS $4
        values[key] = values[key] FS $5 
    }
    FNR == 1 { 
        split(FILENAME, a, /_/)
        header = header FS a[2] 
    }
    END { 
        print header
        for (key in values) 
            print key values[key] 
    }
' file ...

BEGIN 블록에서 헤더를 초기화합니다. 처음 4개 열에 원하는 제목을 지정하세요.

이 변수는 FNR현재 파일의 레코드 번호입니다. FNR == 1파일의 첫 번째 줄에 있을 때 . awk 변수는 FILENAME현재 처리 중인 파일의 이름을 보유합니다.


종류

GNU awk를 사용한다면 END 블록(인용하다):

    END { 
        print header
        # order the array by index, as strings, ascending
        PROCINFO["sorted_in"] = "@ind_str_asc"
        for (key in values) 
            print key values[key] 
    }

GNU awk가 없다면 다음과 같이 할 수 있습니다:

awk '...' | {
    read header
    echo "$header"
    sort
}

관련 정보