我有以下问题。
假设我有两个文件:
文本
1 A1
2 A2
文本
1 B1
2 B2
3 B3
我想使diff只基于第一列的值,所以结果应该是
3 B3
Linux中的bash如何解决这个问题?
最佳答案
[ awk ]是你的朋友
awk 'NR==FNR{f[$1];next}{if($1 in f){next}else{print}}' A.txt B.txt
或者更简单
awk 'NR==FNR{f[$1];next}!($1 in f){print}' A.txt B.txt
或者更简单地说
awk 'NR==FNR{f[$1];next}!($1 in f)' A.txt B.txt
一点解释肯定会有帮助的
NR
&FNR
是awk内置变量,分别代表total number of records - including current - processed so far
和total number of records - including current - processed so far in the current file
,它们仅在处理的第一个文件中相等。f[$1]
首先创建数组f
,然后如果不存在相同的密钥,则将$1
作为键添加。如果没有赋值,那么f[$1]将自动初始化为零,但是这个方面在您的情况中找不到用处next
转到下一个记录,不处理awk脚本的其余部分。请注意,
{if($1 in f){next}else{print}}
部分将只处理第二个文件(以及后续文件(如果有的话))。$1 in f
检查数组$1
中是否存在密钥f
if-else-print
部分是不言而喻的。注意在第三个版本中,
{print}
被省略,因为awk的默认操作是打印!啊!关于linux - 根据特定列在两个文件之间创建差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38739213/