BASH - 如果第一列内容出现在另一个文件中,则删除行

时间:2016-09-03 00:16:52

标签: bash shell command-line file-processing

如果我有两个文件。文件A看起来像:

a 1
a 2
a 3
b 4
c 5

我的文件B有内容:

a
b

对于文件B中出现的所有内容以及文件A中第1列中的内容,我想删除这些行。因此文件A的预期输出应为:

c 5

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

GNU Awk:

awk 'ARGIND == 1 { del[$0]++ } ARGIND == 2 && !del[$1]' B A

处理第一个文件(ARGIND为1)时,通过递增其条目,将$0(每一行)输入关联数组del

处理第二个文件时,如果第一个字段$1del中的非零计数无关,请打印。

当然,我们将B作为第一个文件,A秒。

(当ARGIND == 2 && !del[$1]模式表达式产生布尔值true时,打印操作是隐式的。没有操作的模式具有等同于{ print }的隐含操作。

ARGIND不在POSIX中。在便携式Awk代码中,可以使用丑陋的黑客来区分第一个文件和第二个文件:

awk 'FNR == NR { del[$0]++ } FNR < NR && !del[$1]' B A

处理完第一个文件时,&#34;文件记录号&#34; (当前文件中的记录号)等于&#34;总记录号&#34; (在所有文件中处理的绝对记录号)。当然,如果第一个文件根本不包含任何记录,则会中断。见What is "NR==FNR" in awk?

答案 1 :(得分:0)

以下将完成工作,

awk 'FNR==NR{map[$1]=1;next;}map[$1]==""{print;}' <fileB> <fileA>