두 파일의 열을 병합하고, 중복을 제거하고, 누락된 행을 채우는 방법

두 파일의 열을 병합하고, 중복을 제거하고, 누락된 행을 채우는 방법

병합하려는 두 개의 별도 파일이 있습니다. 각각 7개의 열이 있습니다.

1 10 6 0.02 A 45 0.17
1 15 6 0.03 A 67 0.17
2 33 6 0.10 A 23 0.17 

그리고

1 10 6 0.04 B 87 0.17
1 12 6 0.12 B 93 0.17
2 33 6 0.08 B 45 0.17

중복 항목을 제거하면서 각 파일의 열 1과 열 2를 병합한 다음 각 파일의 열 4 5 6을 열 1과 열 2의 해당 조합에 추가하고 싶습니다. 그런 다음 열 1과 2가 일치하지 않으면 누락된 파일에 대해 인쇄하고 열 4, 5, 6 대신 0을 입력하여 최종 파일이

1 10 0.02 A 45 0.04 B 87
1 12 0    0 0  0.12 B 93
1 15 0.03 A 67 0    0 0
2 33 0.10 A 23 0.08 B 45

답변1

간단한 방법은 awk에서 2D 배열을 사용하는 것입니다.

FNR==NR {a[$1FS$2][0]=$4FS$5FS$6; next}
        {a[$1FS$2][1]=$4FS$5FS$6}
END {
    empty="0"FS"0"FS"0"
    for(i in a)
        print i FS (a[i][0]? a[i][0] : empty) FS (a[i][1]? a[i][1] : empty)
}

스크립트를 파일로 저장하고 실행할 수 있습니다.

awk -f main.awk file1 file2

설명하다

  • 첫 번째 줄 은 file1을 스캔하고 관련 키와 함께 FNR==NR필수 열을 배열에 저장합니다.$4 $5 $6$1 $2a[$1FS$2][0]
  • 두 번째 줄은 기본적으로 file2에서 동일한 작업을 수행하지만 값을 배열에 저장합니다 a[$1FS$2][1]. awk의 배열은 다음과 같기 때문에 이러한 배열 할당 작업은 자동으로 중복 항목을 제거합니다.연관, 즉 각 키는 한 번만 나타날 수 있음을 의미합니다.
  • 내부의 마지막 단계에서 END각 줄을 인쇄하고 각 null 값을 미리 정의된 문자열로 바꿉니다.0 0 0
  • 출력을 인덱스 값을 기준으로 오름차순으로 정렬하려면 PROCINFO["sorted_in"] = "@ind_str_asc"내부 첫 번째 줄에 a를 추가하세요.END

시간이 있으면 설명서를 주의 깊게 읽어보는 것이 도움이 될 것입니다.Gawk 프로그래밍 가이드

관련 정보