파일 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
연결 필드를 설정합니다.