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

Haw*_*awk 6 unix awk sed

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

我的目标是删除一个文件中出现在另一个文件中的行。应考虑多次出现,这意味着,例如,如果一行在文件 A 中出现 4 次,而在文件 B 中仅出现一次,则文件 C 应该包含其中的 3 行。

文件A:

1
3
3
3
4
4
Run Code Online (Sandbox Code Playgroud)

文件B:

1
3
4
Run Code Online (Sandbox Code Playgroud)

文件 C(所需输出)

3
3
4
Run Code Online (Sandbox Code Playgroud)

提前致谢

Sun*_*eep 5

如果输入文件已经按示例所示排序,comm则更适合

$ comm -23 f1 f2
3
3
4
Run Code Online (Sandbox Code Playgroud)

手册页中的选项描述:

   -2     suppress column 2 (lines unique to FILE2)
   -3     suppress column 3 (lines that appear in both files)
Run Code Online (Sandbox Code Playgroud)


Jam*_*own 3

在 awk 中:

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

解释:

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
Run Code Online (Sandbox Code Playgroud)

如果您想打印其中f1没有的项目f2,您可能会丢失($0 in a) &&

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