필드 일치를 기반으로 2개의 파일 병합

필드 일치를 기반으로 2개의 파일 병합

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

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

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

    nextawk나머지 명령을 건너뛰고 다음 줄부터 다시 시작하라고 지시합니다 .

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

    여기에 도착하면 두 번째 파일인 file1. file2array 의 내용에 따라 결정된 대로 에서 줄의 첫 번째 필드를 본 경우 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)

관련 정보