두 개의 입력 파일의 열을 포함하는 파일을 만들고 싶습니다. 파일 1은 다음과 같습니다.
aa 32
bb 15
cc 78
파일 2는 다음과 같습니다.
fa 19
bc 23
cc 50
de 28
aa 45
bb 31
작업은 File1을 읽고 File2의 첫 번째 필드에 행의 첫 번째 필드가 있는 경우 두 열과 함께 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의 첫 번째 열을 키로 사용하여a[$1]=$2
file2의 두 번째 열( 로 표시됨)을$2
배열의 값으로 저장하는 것을 의미합니다 .a
$1
next
awk
나머지 명령을 건너뛰고 다음 줄에서 시작함을 나타냅니다 .($1 in a) {print $1,a[$1],$2}
여기 에 도달
file1
하면 두 번째 파일 을 읽고 있다는 의미입니다 . 파일.file2
a
답변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)