使用 Unix 和 Awk 查找在一个文件中但不在另一个文件中的行

Nam*_*ata 5 bash awk text-processing

我有 7 个字段的 2 个文件,我想根据 field1 和 field2 打印文件 1 中存在但文件 2 中不存在的行。

逻辑:我想打印所有行,其中有特定的 column1 和 column2。并且我们在文件 2 中没有找到 column1 和 column2 的集合。示例:“sc2/10 10” 这个集合你不会在文件 2 中看到,因此它被打印为输出。

文件1:

sc2/80         20      .        A       T         86       F=5;U=4
sc2/60         55      .        G       T         76       F=5;U=4
sc2/10         10      .        G       C         50       F=5;U=4
sc2/68         20      .        T       C         71       F=5;U=4
sc2/24         24      .        T       G         31       F=5;U=4
sc2/11         30      .        A       T         60       F=5;U=4
Run Code Online (Sandbox Code Playgroud)

文件2:

sc2/80         20      .        A       T         30       F=5;U=4 
sc2/60         55      .        T       T         77       F=5;U=4 
sc2/68         20      .        C       C         01       F=5;U=4
sc2/24         29      .        T       G         31       F=5;U=4
sc2/24         19      .        G       G         11       F=5;U=4
sc2/88         89      .        T       G         51       F=5;U=4
Run Code Online (Sandbox Code Playgroud)

预期输出:

sc2/10         10      .        G       C         50       F=5;U=4 
sc2/11         30      .        A       T         60       F=5;U=4 
Run Code Online (Sandbox Code Playgroud)

我会很感激你的帮助。

Tho*_*hor 7

除非输入很大,否则我会将这些file2对保存到哈希中并使用它来忽略file1. 例如:

awk 'FNR == NR { h[$1,$2]; next }; !($1 SUBSEP $2 in h)' file2 file1
Run Code Online (Sandbox Code Playgroud)

输出:

sc2/10         10      .        G       C         50       F=5;U=4         
sc2/24         24      .        T       G         31       F=5;U=4
sc2/11         30      .        A       T         60       F=5;U=4
Run Code Online (Sandbox Code Playgroud)

IIUCsc2/24 24正确包含在输出中。

解释

  • FNR == NR { h[$1,$2]; next }$1/$2将对保存到h哈希中(请注意,通过下标访问数组足以分配它),但只能从第一个输入文件 ( file2) 中保存。该next命令跳到下一条记录。
  • ! ($1 SUBSEP $2 in h)仅对包含对的file1行进行评估并将调用默认块。默认块是. (注意:避免使用(same as ) 因为那样会分配它)$1/$2{ print $0 }!h[$1,$2]!h[$1 SUBSEP $2]

以上假设在文件的前两个字段中找不到SUBSEP(通常是^\字符)的值。