我有以下问题。
说我有2个文件:
A.TXT
1 A1
2 A2
B.txt
1 B1
2 B2
3 B3
我想制作仅基于第一列值的diff,因此结果应为
3 B3
如何用linux中的bash解决这个问题?
答案 0 :(得分:3)
[ 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的默认操作是打印!! 答案 1 :(得分:2)
awk 'NR==FNR{array[$1];next} !($1 in array)' a.txt b.txt
3 B3
答案 2 :(得分:0)
在bash
中这样,但前提是你真的对第二列不感兴趣:
diff <(cut -f1 -d" " A.txt) <(cut -f1 -d" " B.txt)