두 파일에서 특정 열의 공통 요소를 찾아 각 파일의 열 값을 출력합니다.

두 파일에서 특정 열의 공통 요소를 찾아 각 파일의 열 값을 출력합니다.

다음과 같이 탭으로 구분된 값을 가진 두 개의 파일이 있습니다.

파일 1:

A    1
B    3
C    1
D    4

파일 2:

E    1
B    3
C    2
A    9

열 1에 동일한 문자열이 있는 파일 1과 파일 2 사이의 행을 찾은 다음 해당 값을 얻고 싶습니다. 원하는 출력은 다음과 같은 단일 파일입니다.

B    3    3
C    1    2
A    1    9

Unix one-liner로 이것이 가능합니까?

답변1

join결과의 줄 순서가 관련이 없는 경우 GNU coreutils에는 필요한 작업을 정확하게 수행하는 명령이 포함되어 있습니다.

join <(sort file1) <(sort file2)

A 1 9
B 3 3
C 1 2

탭을 복원하려면 다음을 수행하십시오.

join <(sort file1) <(sort file2) | tr ' ' '\t'

A   1   9
B   3   3
C   1   2

또는 t옵션을 사용하세요 join.

( <()일명 프로세스 교체, ksh93(이 기능의 출처), bash 또는 zsh 필요)

답변2

ire@localhost: sort -k1 file2 | join file1 -
A 1 9
B 3 3
C 1 2

출력에 탭 문자를 사용하려면 다음을 수행하십시오.

sort -k1 file2 | join -t "        " file1 -

CTRL-V 를 눌러 따옴표 안에 탭을 만들 수 있습니다 <tab>.

답변3

awk는 출력을 정렬하지 않고 file2와 동일한 순서로 정렬하려는 경우 좋은 도구입니다.

awk '
    NR == FNR {val[$1]=$2; next} 
    $1 in val {print $1, val[$1], $2}
' file1 file2

관련 정보