병합하려는 두 개의 별도 파일이 있습니다. 각각 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 $2
a[$1FS$2][0]
- 두 번째 줄은 기본적으로 file2에서 동일한 작업을 수행하지만 값을 배열에 저장합니다
a[$1FS$2][1]
. awk의 배열은 다음과 같기 때문에 이러한 배열 할당 작업은 자동으로 중복 항목을 제거합니다.연관, 즉 각 키는 한 번만 나타날 수 있음을 의미합니다. - 내부의 마지막 단계에서
END
각 줄을 인쇄하고 각 null 값을 미리 정의된 문자열로 바꿉니다.0 0 0
- 출력을 인덱스 값을 기준으로 오름차순으로 정렬하려면
PROCINFO["sorted_in"] = "@ind_str_asc"
내부 첫 번째 줄에 a를 추가하세요.END
시간이 있으면 설명서를 주의 깊게 읽어보는 것이 도움이 될 것입니다.Gawk 프로그래밍 가이드