2016-08-03 78 views

回答

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 

的解释有点C会不会ertainly帮助

  1. NR & FNR是AWK内置其中代表total number of records - including current - processed so fartotal number of records - including current - processed so far in the current file分别变量,它们将只对处理的第一个文件相同。

  2. f[$1]首先创建数组f,然后将$1作为密钥添加,如果相同的密钥尚不存在。如果没有赋值,那么f [$ 1]会自动初始化为0,但是这方面没有在您的案例中找到用处

  3. next转到下一条记录,而没有处理awk脚本的其余部分。

  4. 请注意{if($1 in f){next}else{print}}部分将仅针对第二个(及其后的文件)进行处理。
  5. $1 in f检查该键$1存在阵列f
  6. if-else-print部分是自解释的。
  7. 注意在第三个版本中,{print}被省略,因为awk的默认动作是打印!

+1

或者更简单地'的awk“NR == FNR { f [$ 1];下一个}!(f中$ 1)'' – 123

+0

@ 123:我敢打赌,你很擅长这个.. :) Thankyou会将它添加到解决方案中 – sjsam

0

这样在bash,但只有当你真的在第二列在所有感兴趣:

diff <(cut -f1 -d" " A.txt) <(cut -f1 -d" " B.txt) 
2
awk 'NR==FNR{array[$1];next} !($1 in array)' a.txt b.txt 
3 B3