AWK One-liner将文件与黑名单文件进行比较并删除违规行

时间:2016-02-15 20:03:38

标签: bash awk

好的,我有两个文本文件。

File1是制表符分隔的并且有多个列,特别是它包含一列我要与File2进行比较的值。该文件未以任何方式排序

File2是一列值,即黑名单。它的长度比File1短,但是已经排序。

我想比较这两个列,每个文件一个,如果File1中的任何值与File2匹配,我不想打印该行。

File1中:

col1 col2 col3 col4
val  val  34   val
val  val  110  val
val  val  24   val
val  val  300  val
val  val  55   val

文件2:

24
34
55

期望的输出:

col1 col2 col3 col4
val  val  110  val
val  val  300  val

到目前为止,我有这个:

awk -F '\t' '{i =1}NR==FNR{a[$3];next}{if($1 in a){print FNR,i++}}' File1 File2 > output.txt

我有点在黑暗中探索,不知道如何从中得到我需要的东西。谢谢你的帮助。

3 个答案:

答案 0 :(得分:1)

使用awk,你需要将file2存储在一个数组中(使用字段作为键,并使用真值1),然后测试处理file1时返回a[$3]的内容:

awk 'NR==FNR{a[$1]=1;next} !a[$3]' file2 file1

答案 1 :(得分:0)

你可以通过两次sed调用来实现:

s=`sed -r 's+(.*)+/\1/ d+' fv2.txt` 
sed "$s" fv1.txt 

第一个在$s中从第二个文件构建一个sed脚本,该脚本在第二个sed调用中使用时会过滤第一个文件中的行。

答案 2 :(得分:0)

awk '
NR == FNR { skip[$1] = 1; next }
$3 in skip { next }
{ print }' File2 File1