# comm -12 /tmp/src /tmp/txt | wc -l
10338
# join /tmp/src /tmp/txt | wc -l
10355
Run Code Online (Sandbox Code Playgroud)
这两个文件都是单列字母数字字符串和sort-ed。他们不应该是一样的吗?
更新以下@Kevin-s 回答:
cat /tmp/txt | sed 's/^[:space:]*//' > /tmp/stxt
cat /tmp/src | sed 's/^[:space:]*//' > /tmp/ssrc
Run Code Online (Sandbox Code Playgroud)
结果:
#join /tmp/ssrc /tmp/stxt | wc -l
516
# comm -12 /tmp/ssrc /tmp/stxt | wc -l
513
Run Code Online (Sandbox Code Playgroud)
在手动检查diff-s 时...结果不同,因为sed.
comm和之间有几个区别join:
comm比较整行;join比较行内的字段。comm打印整行;join可以打印选定部分的线条。当每个文件中只有一列数据时,差异相对较小。当您有多个列时,可能会有很多不同。
另请注意,在正确的情况下,join可以从一个文件输出多个数据副本,同时与另一个文件的不同行连接。这在我看来就像你的问题;您可能在其中一个文件中有一些重复的值。假设你有:
src txt
123 123
123
123
Run Code Online (Sandbox Code Playgroud)
如果你这样做comm -12 src txt,你会得到一行输出;如果你这样做join src txt,你会得到三行输出。这是预期的。
该join命令还可以处理“外部连接”,其中第二个文件中第一个文件中的一行数据丢失(SQL 中的 LEFT OUTER JOIN),反之亦然(RIGHT OUTER JOIN),或同时处理(a完全外连接)。
总而言之,join是一个更复杂的命令,但它正在尝试做一个更复杂的工作。两者都很有用;但它们在不同的地方很有用。