두 개의 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()
.
k
sub()
호출로 인해 값이 변경되므로 코드의 두 번째 부분에 있는 변수가 필요합니다 $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