根据特定列在两个文件之间创建差异

时间:2016-08-03 09:09:57

标签: linux bash

我有以下问题。

说我有2个文件:

A.TXT

1    A1
2    A2

B.txt

1    B1
2    B2
3    B3

我想制作仅基于第一列值的diff,因此结果应为

3     B3

如何用linux中的bash解决这个问题?

3 个答案:

答案 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

一些解释肯定有帮助

  1. 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 ,它们仅对第一个文件相同处理。

  2. f[$1]首先创建数组f,然后如果相同的键尚不存在则添加$1作为键。如果没有分配值,则f [$ 1]会自动初始化为零,但此方面在您的情况下找不到用途

  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 :(得分: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)