두 개의 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,V4
ID2
file2
result
file1
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개 값 집합에 대해 파일 간에 일치하는 항목이 여러 개 있는 상황을 어떻게 처리할지 추측하고 있습니다.