从另一个文件中减去一个文件中的行

时间:2017-03-06 10:53:07

标签: unix awk sed

我无法找到真正从另一个文件中减去一个文件的答案。

我的目标是删除一个文件中出现在另一个文件中的行。 应该遵守多次出现,这意味着例如,如果一行在文件A中出现4次而在文件B中只出现一次,则文件C应该有3行。

档案A:

1
3
3
3
4
4

档案B:

1
3
4

文件C(所需输出)

3
3
4

提前致谢

3 个答案:

答案 0 :(得分:3)

在awk中:

$ awk 'NR==FNR{a[$0]--;next} ($0 in a) && ++a[$0] > 0' f2 f1
3
3
4

说明:

NR==FNR {                  # for each record in the first file
    a[$0]--;               # for each identical value, decrement a[value] (of 0)
    next
} 
($0 in a) && ++a[$0] > 0'  # if record in a, increment a[value]
                           # once over remove count in first file, output

如果您要打印f1中不在f2的商品,可能会丢失($0 in a) &&

$ echo 5 >> f1
$ awk 'NR==FNR{a[$0]--;next} (++a[$0] > 0)' f2 f1
3
3
4
5

答案 1 :(得分:1)

如果输入文件已按样本中所示排序,则comm将更适合

$ comm -23 f1 f2
3
3
4

手册页中的选项说明:

   -2     suppress column 2 (lines unique to FILE2)
   -3     suppress column 3 (lines that appear in both files)

答案 2 :(得分:1)

你可以这样做:

awk 'NR==FNR{++cnt[$1]
             next}
     cnt[$1]-->0{next}
     1' f2 f1