Awk - 두 파일 간의 값을 일치시키고 새 파일을 만듭니다.

Awk - 두 파일 간의 값을 일치시키고 새 파일을 만듭니다.

두 파일에 있는 데이터를 사용하여 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병에 적힌 대로 입력을 정렬합니다 .

관련 정보