awk를 사용하여 두 개의 CSV 파일을 일치시키는 방법은 무엇입니까?

awk를 사용하여 두 개의 CSV 파일을 일치시키는 방법은 무엇입니까?

두 개의 CSV 파일이 있습니다

ID1,V1,V2,V3,V4
1,4,5,3,3
2,66,77,46,44
3,66,77,46,44

ID2,V1,V2,V3,V4
55,4,5,3,3
84,66,77,46,44

CSV를 어떻게 얻나요?

ID1,ID2
1,55
2,84
3,84

V1,V2,V3,V4두 개의 CSV 파일에서 블록을 일치시킵니까 ?

의 해당 값을 file1대체하여 재현하는 것이 목표입니다 . 즉, 파일의 줄 수는 .V1,V2,V3,V4ID2file2resultfile1

ID1그리고 ID2독특하고 질서있고 ID1,ID2독특할 것입니다. 파일 형식이 정확합니다. ,5개 열에 구분 기호로 구분된 숫자 만 표시합니다.

파일은 꽤 크며(1B 라인) 이것이 제가 필요한 것입니다 awk.

주어진 해결책여기작동해야 하지만 반대 연결(Universal ID)이므로 내 경우에 맞게 조정할 수 없습니다.

답변1

다음은 속도가 빠르며 해당 sort부분만 메모리에 많은 양의 데이터를 저장하고 페이징 등을 수행하도록 구축되었습니다. 처리하면 괜찮을 것입니다.

$ cat tst.sh
#!/usr/bin/env bash

# First awk output is hdrFlag,fileNr,ID,VALs1-4 then we sort on
# the hdrFlag to handle the header line first, then the key values
# so we can process all matching keys together from both input
# files so we only have to store the IDs for the current key set.
awk 'BEGIN{FS=OFS=","} FNR==1{++fileNr} {print (FNR>1), fileNr, $0}' "$@" |
sort -t, -k1,1n -k4 |
awk '
    BEGIN { FS=OFS="," }
    {
        curr = $4 FS $5 FS $6 FS $7
        if ( curr != prev ) {
            prt()
            prev = curr
        }
        ids[$2] = ($2 in ids ? ids[$2] " " : "") $3
    }
    END { prt() }

    function prt(       file,numFiles) {
        for (file in ids) {
            numFiles++
        }
        if (numFiles > 1) {
            print ids[1], ids[2]
        }
        delete ids
    }
'

.

$ ./tst.sh file1 file2
ID1,ID2
1,55
2,84

동일한 4개 값 집합에 대해 파일 간에 일치하는 항목이 여러 개 있는 상황을 어떻게 처리할지 추측하고 있습니다.

관련 정보