두 텍스트 파일의 두 번째 열을 비교하고 일치하면 두 파일의 첫 번째 열을 인쇄하려고 합니다.
다음 코드를 시도했지만 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]
첫 번째 파일의 첫 번째 필드를 포함하는 동일한 키 값을 인쇄합니다.같은 키.