두 개의 입력 파일의 열을 포함하는 파일을 만들고 싶습니다. File1은 다음과 같습니다.
aa 32
bb 15
cc 78
파일2는 다음과 같습니다:
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
작업은 행의 첫 번째 필드가 File2의 첫 번째 필드 사이에 있는 경우 File1을 통해 읽은 다음 두 열을 모두 사용하여 File2의 해당 줄을 인쇄하고 첫 번째 필드를 포함하는 File1의 두 번째 열 항목을 추가하는 것입니다.
출력은 다음과 같아야 합니다.
aa 45 32
bb 31 15
cc 50 78
스크립트에는 awk가 선호됩니다.
답변1
$ awk 'FNR==NR{a[$1]=$2;next} ($1 in a) {print $1,a[$1],$2}' file2 file1
aa 45 32
bb 31 15
cc 50 78
설명:
awk
암시적으로 각 파일을 한 번에 한 줄씩 반복합니다. 첫 번째 인수로 제공했으므로 file2
먼저 읽습니다. file1
두 번째로 읽혀집니다.
FNR==NR{a[$1]=$2;next}
NR
awk
지금까지 읽은 줄 수 이고 현재 파일에서 지금까지 읽은FNR
줄 수입니다 .awk
따라서 이면FNR==NR
우리는 여전히 첫 번째 명명된 파일인 을 읽고 있습니다file2
. 의 모든 라인에 대해file2
를 할당합니다a[$1]=$2
.여기는
a
연관 배열이는 file2의 첫 번째 열인 을 키로 사용하여 file2의 두 번째 열인 을 배열의 값으로a[$1]=$2
저장하는 것을 의미합니다 .$2
a
$1
next
awk
나머지 명령을 건너뛰고 다음 줄부터 다시 시작하라고 지시합니다 .($1 in a) {print $1,a[$1],$2}
여기에 도착하면 두 번째 파일인
file1
.file2
array 의 내용에 따라 결정된 대로 에서 줄의 첫 번째 필드를 본 경우a
두 파일의 필드 2 값이 포함된 줄을 인쇄합니다.
답변2
나는 awk 솔루션을 좋아하지만 이것이 더 쉬울 수도 있다고 생각합니다.
sort file1 > sortedFile1
sort file2 > sortedFile2
join -o 1.1 2.2 1.2 sortedFile1 sortedFile2
이 옵션은 -o
첫 번째 파일의 첫 번째 필드, 두 번째 파일의 두 번째 필드, 첫 번째 파일의 두 번째 필드로 선택하는 형식을 재정의합니다.
답변3
두 번째 파일을 File2
첫 번째 파일 인 File1
.
join <(sort -k1 file2) <(sort -k1 file1)