我有多个程序,每个程序都产生输出行。如何连接这些输出,然后只返回至少重复一次的每一行的一个副本?换句话说,我想返回所有响应行的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命令行方式。
答案 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]