두 텍스트 파일의 두 번째 열을 비교하고 일치하면 두 파일의 첫 번째 열을 인쇄합니다.

두 텍스트 파일의 두 번째 열을 비교하고 일치하면 두 파일의 첫 번째 열을 인쇄합니다.

두 텍스트 파일의 두 번째 열을 비교하고 일치하면 두 파일의 첫 번째 열을 인쇄하려고 합니다.

다음 코드를 시도했지만 awk작동하지 않습니다

1) awk 'NR==FNR {a[$2]=$2; next} {print $1,a[$1]}' nid8.txt nid9.txt

2) awk 'NR==FNR {a[$2]=$2; next} {print $1, $1 in a}' nid8.txt nid9.txt

예시 파일:

nid8.txt:

1000 500
1001 501
1002 502
1003 503
1004 504
1005 505

nid9.txt:

2000 504
2001 502
2002 508
2003 505
2004 500
2005 501

산출:

1000 2004
1001 2005
1002 2001
1004 2000
1005 2003

답변1

여기서 사용할 수 있습니다 join:

join -j 2 -o 1.1 2.1 <(sort -nk2,2 nid8.txt) <(sort -nk2,2 nid9.txt)

두 파일의 두 번째 필드를 -j 2키로 사용합니다.

-o다음 필드를 출력합니다. 첫
번째 파일의 첫 번째 필드 1.1
두 번째 파일의 첫 번째 필드2.1

join입력 파일을 정렬해야 하므로 숫자 키로 사용될 두 번째 필드에 입력 파일을 정렬합니다 sort -nk2,2 input.


이를 사용하면 awk입력을 정렬할 필요가 없지만 첫 번째 입력 파일을 메모리에 로드합니다.

awk '!second_file{ my_array[$2]=$1; next }
     ($2 in my_array) { print $1, my_array[$2] }' nid8.txt second_file=1 nid9.txt

my_array[$2]=$1첫 번째 입력 파일의 첫 번째 열을 저장하고 있습니다 .nid8.txtsecond_file변수 값이 다음으로 설정되지 않을 때까지 키가 동일한 첫 번째 파일의 두 번째 열인 경우에만1이로 인해 !second_file표현식이 false로 평가되고 다음 입력에 대해 블록이 실행되지 않습니다.

조건을 사용하여 ($2 in my_array)두 번째 필드가 배열에 존재하는지 확인합니다.내 배열또는 존재하지 않는 경우, 존재하는 경우 첫 번째 필드 $1 (두 번째 파일의)와 my_array[$2]첫 번째 파일의 첫 번째 필드를 포함하는 동일한 키 값을 인쇄합니다.같은 키.

관련 정보