比较两个文本文件的第二列,如果匹配则打印两个文件的第一列

比较两个文本文件的第二列,如果匹配则打印两个文件的第一列

我正在尝试比较两个文本文件的第二列,并打印两个文件的第一列(如果匹配)。

我已经尝试过以下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]包含第一个文件中第一个字段的同一个键的值相同的钥匙

相关内容