# comm -12 /tmp/src /tmp/txt | wc -l
10338
# join /tmp/src /tmp/txt | wc -l
10355
这两个文件都是单列的字母数字字符串和排序
-ed。它们不应该相同吗?
更新了以下@Kevin-s 的回答:
cat /tmp/txt | sed 's/^[:space:]*//' > /tmp/stxt
cat /tmp/src | sed 's/^[:space:]*//' > /tmp/ssrc
结果:
#join /tmp/ssrc /tmp/stxt | wc -l
516
# comm -12 /tmp/ssrc /tmp/stxt | wc -l
513
在手动检查 diff
-s 时...由于 sed
未删除的一些空格,结果有所不同。
最佳答案
comm
和 join
之间有一些区别:
comm
比较整行;join
比较行内的字段。comm
打印整行;join
可以打印选定的部分行。
当每个文件中只有一列数据时,差异相对较小。当您有多个列时,可能会有很大差异。
另请注意,在适当的情况下,join
可以从一个文件中输出多个数据副本,同时从另一个文件中加入不同的行。在我看来,这就像你的问题;您可能在其中一个文件中有一些重复值。假设你有:
src txt
123 123
123
123
如果你执行comm -12 src txt
,你会得到一行输出;如果你执行 join src txt
,你将得到三行输出。这是预期的。
join
命令还可以处理“外部连接”,其中第二个文件中的第一个文件中的一行数据丢失(SQL 中的 LEFT OUTER JOIN),反之亦然(a RIGHT OUTER JOIN),或两者同时进行(FULL OUTER JOIN)。
总而言之,join
是一个更复杂的命令,但它试图完成更复杂的工作。两者都有用;但它们在不同的地方很有用。
关于bash:join 和 comm 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7234028/