连接linux程序输出,只返回重复的那些

时间:2011-01-25 00:49:54

标签: linux unix command-line

我有多个程序,每个程序都产生输出行。如何连接这些输出,然后只返回至少重复一次的每一行的一个副本?换句话说,我想返回所有响应行的set intersection

例如:

$ progA
9
13
14
15
$ progA --someFlag
13
14
15
100
$ progB
14
15
-42
$ magicFunction 'progA' 'progA --someFlag' 'progB'
14
15

这本身并不是一个功能。我只想要一个unix命令行方式。

2 个答案:

答案 0 :(得分:4)

怎么样:

( progA; progA --someFlag; progB ) | sort | uniq -d

-d的{​​{1}}选项强制它仅输出包含多个副本的行。

以上是单行代码的变体,不使用子shell:

uniq

至少在{ progA; progA --someFlag; progB; } | sort | uniq -d 中有效。请注意大括号中最后一个命令后所需的终止分号(bash)。

答案 1 :(得分:1)

上述解决方案并未真正计算所有3个输出的集合交集。 uniq -d还将输出仅由3个程序中的2个输出的行。 这是我的看法:

progA | sort > f1; progA --someFlag | sort > f2; progB | sort > f3; comm -1 -2 f1 f2 | comm -1 -2 f3 -; rm f[123]