두 파일의 일치하는 ID를 두 파일의 다른 열과 연결합니다.

두 파일의 일치하는 ID를 두 파일의 다른 열과 연결합니다.

파일 A의 ID를 파일 B와 일치시키고 두 파일에 속하는 열이 있는 세 번째 파일에 저장하고 싶습니다. 나는 내가 찾은 거의 모든 awks를 시도했지만 왠지 작동하지 않습니다. 귀하의 도움에 크게 감사하겠습니다!

fileA:

id;name
1;"sam"
4;"jon"

fileB:

id;surname
5;"smith"
1;"khon"

file3:

id;name;surname
1;"sam";"khon"

답변1

일반적으로 이것이 작업이 됩니다 join. 그러나 join입력은 정렬되어야 하며 sort내가 알고 있는 모든 로케일에서 문자 앞에 숫자가 와야 합니다(사실이 아닌 경우 정정해 주십시오). 따라서 join그 중 일부만 거기에 도달할 수 있습니다.

$ join -t';' <(sort fileA) <(sort fileB)
1;"sam";"khon"
id;name;surname

각 파일의 첫 번째 줄을 먼저 연결한 다음 나머지 줄을 연결하여 이 문제를 해결할 수 있습니다.

$ join -t';' <(head -n1 fileA) <(head -n1 fileB)
id;name;surname
$ join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
1;"sam";"khon"

그런 다음 이를 하위 쉘로 그룹화하고 출력을 리디렉션하면 원하는 출력이 제공됩니다.

 $ ( join -t';' <(head -n1 fileA) <(head -n1 fileB); join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort))
id;name;surname
1;"sam";"khon"

그래서 당신은 이것을 할 수 있습니다 :

( 
    join -t';' <(head -n1 fileA) <(head -n1 fileB); 
    join -t';' <(tail -n+2 fileA | sort) <(tail -n+2 fileB | sort)
) > file3

또는 실제로 다음을 수행할 수 있습니다 awk.

$ awk -F';' '(NR==FNR){data[$1]=$1";"$2; next} 
             ($1 in data){print data[$1]";"$2}' fileA fileB 
id;name;surname
1;"sam";"khon"

답변2

밀러 사용(https://github.com/johnkerl/miller) 그리고 실행

mlr --csv --fs ";" join -j id -f fileA.csv fileB.csv >file3.csv

당신은

+----+------+---------+
| id | name | surname |
+----+------+---------+
| 1  | sam  | khon    |
+----+------+---------+

몇 가지 참고사항:

  • --fs필드 구분 기호를 설정합니다.
  • -j연결 필드를 설정합니다.

관련 정보