두 파일에 있는 데이터를 사용하여 Final.txt 파일을 비교하고 생성하려는 파일이 두 개 있습니다.
File1 - 열 1과 File2 - 열 2에는 두 파일 간에 일치시키는 데 필요한 값이 포함되어 있습니다.
따라서 본질적으로 저는 File1에서 컬럼1을 가져오려고 시도하고 있으며 file2의 컬럼2에 일치하는 항목이 있으면 File1Column1, File1Column2 및 File2Column1을 final.txt라는 새 파일에 씁니다.
예
파일 1
1000,Brian
1010,Jason
400,Nick
파일 2
3044 1000
4466 400
1206 1010
Final.txt 파일은 다음과 같습니다.
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
나는 awk를 사용하여 이 작업을 수행할 수 있어야 한다고 생각하지만, 어떤 이유로든 수행하는 데 정말 어려움을 겪고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.
감사해요
답변1
한 가지 방법은 다음과 같습니다.
$ awk -F"[, ]" 'NR==FNR{a[$1]=$1","$2; next} ($2 in a){print a[$2]","$1}' file1 file2
1000,Brian,3044
400,Nick,4466
1010,Jason,1206
-F"[, ]"
필드 구분 기호를 공백이나 쉼표로 설정합니다 . FNR
현재 줄 번호와 NR
현재 파일의 현재 줄 번호입니다. 두 파일은 첫 번째 파일을 읽는 경우에만 동일합니다. 따라서 NR==FNR{a[$1]=$1","$2; next}
첫 번째 파일의 줄에서만 실행되고 첫 번째 필드와 두 번째 필드(사이에 쉼표 포함)를 a
키가 첫 번째 필드인 배열의 값으로 저장합니다. 그런 다음 두 번째 파일을 읽을 때 두 번째 필드가 있으면 a
해당 값(첫 번째 파일의 첫 번째 및 두 번째 필드)과 두 번째 파일의 첫 번째 필드를 인쇄합니다.
그런데 실제로 그런 일을 해 주는 앱이 있습니다! 이것이 바로 이 물건이 join
만들어진 이유입니다. 안타깝게도 두 파일이 정렬되지 않았고 구분 기호가 다르기 때문에 몇 가지 트릭이 필요합니다. 쉘이 이를 지원하는 경우 <()
다음을 수행할 수 있습니다.
$ join -t, -1 1 -2 2 <(sort file1) <(sed 's/ /,/g' file2 | sort -t"," -k2)
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
이 join -t, -1 1 -2 2
방법은 구분 기호로 사용되며 ,
file1의 첫 번째 필드와 file2의 두 번째 필드를 연결합니다. 공백을 쉼표로 바꾸면 sed
두 파일 모두에 동일한 구분 기호가 있습니다. sort
병에 적힌 대로 입력을 정렬합니다 .