필드 일치를 기반으로 2개의 파일을 병합합니다.

필드 일치를 기반으로 2개의 파일을 병합합니다.

두 개의 입력 파일의 열을 포함하는 파일을 만들고 싶습니다. 파일 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}

    NRawk지금까지 읽은 줄 수는 FNR현재 파일에서 지금까지 읽은 줄 수입니다. awk따라서 FNR==NR, 우리는 여전히 첫 번째 명명된 파일을 읽고 있습니다: file2. 의 각 행에 대해 file2을 할당합니다 a[$1]=$2.

    여기 a에는연관 배열file2의 첫 번째 열을 키로 사용하여 a[$1]=$2file2의 두 번째 열( 로 표시됨)을 $2배열의 값으로 저장하는 것을 의미합니다 .a$1

    nextawk나머지 명령을 건너뛰고 다음 줄에서 시작함을 나타냅니다 .

  • ($1 in a) {print $1,a[$1],$2}

    여기 에 도달 file1하면 두 번째 파일 을 읽고 있다는 의미입니다 . 파일.file2a

답변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)

관련 정보