我正在尝试比较两个文本文件的第二列,并打印两个文件的第一列(如果匹配)。
我已经尝试过以下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.txt 仅当键是同一第一个文件的第二列时,直到second_file
变量值未设置为1这会导致!second_file
表达式值计算为 false 并且不会为下一个输入执行该块。
通过($2 in my_array)
条件,我们检查数组中是否存在第二个字段我的数组或不存在,如果存在,那么我们打印第一个字段$1
(来自第二个文件)以及my_array[$2]
包含第一个文件中第一个字段的同一个键的值相同的钥匙。