我遇到以下问题。根据特定列在两个文件之间创建差异
说我有2个文件:
A.TXT
1 A1
2 A2
B.txt
1 B1
2 B2
3 B3
我要让这是仅基于第一列的值差异,所以结果应该是
3 B3
在linux中如何用bash解决这个问题?
我遇到以下问题。根据特定列在两个文件之间创建差异
说我有2个文件:
A.TXT
1 A1
2 A2
B.txt
1 B1
2 B2
3 B3
我要让这是仅基于第一列的值差异,所以结果应该是
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
的解释有点C会不会ertainly帮助
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]会自动初始化为0,但是这方面没有在您的案例中找到用处
next
转到下一条记录,而没有处理awk脚本的其余部分。
{if($1 in f){next}else{print}}
部分将仅针对第二个(及其后的文件)进行处理。$1 in f
检查该键$1
存在阵列f
if-else-print
部分是自解释的。{print}
被省略,因为awk的默认动作是打印!这样在bash
,但只有当你真的不在第二列在所有感兴趣:
diff <(cut -f1 -d" " A.txt) <(cut -f1 -d" " B.txt)
awk 'NR==FNR{array[$1];next} !($1 in array)' a.txt b.txt
3 B3
或者更简单地'的awk“NR == FNR { f [$ 1];下一个}!(f中$ 1)'' – 123
@ 123:我敢打赌,你很擅长这个.. :) Thankyou会将它添加到解决方案中 – sjsam