删除两个命令产生的输出共有的行

use*_*000 5 duplicate text-processing

说,我有两个返回一些文本的命令。例如:

$ ./c1
/usr/bin/foo
/usr/bin/bar
/usr/bin/baz
$ ./c2
/usr/bin/foo
/usr/bin/qux
/usr/bin/buzz
/usr/bin/bar
Run Code Online (Sandbox Code Playgroud)

我想删除重复的行;即输出将是(顺序不重要):

/usr/bin/baz
/usr/bin/qux
/usr/bin/buzz
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Bru*_*ger 7

一个相当简单的管道应该可以解决问题:

(./c1; ./c2) | sort -u
Run Code Online (Sandbox Code Playgroud)

括号将两者的 stdout./c1./c2stdin 放入sort命令的stdin 中。该选项-u仅打印每组匹配行中的 1 个。

感谢 John WH Smith 注意到一个简化,感谢 Bakuriu 的洞察力。


cuo*_*glm 6

随着comm来自GNU coreutils

$ comm -3 <(sort -u <(./c1)) <(sort -u <(./c2)) | tr -d '\t'
/usr/bin/baz
/usr/bin/buzz
/usr/bin/qux
Run Code Online (Sandbox Code Playgroud)

来自man comm

Compare sorted files FILE1 and FILE2 line by line.

       With  no  options,  produce  three-column  output.  Column one contains
       lines unique to FILE1, column two contains lines unique to  FILE2,  and
       column three contains lines common to both files.

       -1     suppress column 1 (lines unique to FILE1)

       -2     suppress column 2 (lines unique to FILE2)

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