공통 데이터를 기반으로 파일 병합

공통 데이터를 기반으로 파일 병합

두 개의 csv 파일이 있습니다

파일 1:

799001,8_802,3122,627654

파일 2:

799001,567765,v567575

1열의 키로 두 파일을 병합하려고 하면 파일이 병합되는 것을 볼 수 있는데, file1의 3열은 인쇄되지 않습니다.

내 결과:

799001,2_802_3122,567765,v567575

예상 출력:

799001,2_802_3122,627654,567765,v567575

나는 이것을 시도했습니다 :

awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 , $3 , $4 }' file1 file2

왜 Column3이 병합되지 않습니까?

답변1

두 파일이 조인 필드(쉼표로 구분된 첫 번째 필드)에 정렬되어 있다고 가정하면 다음을 사용할 수 있습니다.

$ join -t , file1 file2
799001,8_802,3122,627654,567765,v567575

데이터가 정렬되지 않은 경우 새 정렬 파일을 생성하거나 프로세스 대체(이를 지원하는 셸에서)를 사용하여 데이터를 사전 정렬해야 합니다.

$ join -t , <( sort file1 ) <( sort file2 )
799001,8_802,3122,627654,567765,v567575

그렇지 않으면생각하다하나 또는 다른 파일의 순서를 유지하기 위해 데이터를 정렬하려면 awk다음과 같이 사용할 수 있습니다.

$ awk -F , 'BEGIN { OFS = FS } NR == FNR { key[$1] = $0; next } ($1 in key) { k = $1; sub("^[^,]*,",""); print key[k], $0 }' file1 file2
799001,8_802,3122,627654,567765,v567575

이것은비슷한당신이 가지고 있지만 저장할 수 있는 것에전선연관 배열에서. 그런 다음 명령문은 print첫 번째 필드가 제거된 경우를 제외하고 두 번째 파일의 줄을 따라 첫 번째 파일에 저장된 값을 출력합니다 sub().

ksub()호출로 인해 값이 변경되므로 코드의 두 번째 부분에 있는 변수가 필요합니다 $1.

호출에서는 sub()이것이 FS쉼표라고 가정합니다. 대신 실제 값을 사용하려면 FS무엇이든 다음을 사용하십시오.

sub("^[^" FS "]*" FS,"")

대신에. FS단일 문자인 경우에는 작동합니다.

두 번째 파일의 필드 수에 대한 사전 지식을 사용하시겠습니까? sub()및 변수에 대한 k다소 혼란스러운 호출을 피할 수 있습니다.

$ awk -F , 'BEGIN { OFS = FS } NR == FNR { key[$1] = $0; next } ($1 in key) { print key[$1], $2, $3 }' file1 file2
799001,8_802,3122,627654,567765,v567575

관련 정보