我有以下问题。
假设我有两个文件:
文本

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 fartotal 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/

10-14 14:11
查看更多