bash:join 和 comm 之间的区别

标签 bash join comm

# 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 未删除的一些空格,结果有所不同。

最佳答案

commjoin 之间有一些区别:

  1. comm 比较整行; join 比较行内的字段。
  2. 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/

相关文章:

C++ STL 算法,如 'comm' 实用程序

linux - 保证文件夹的原子移动

MySQL 选择连接空值

bash - 比较两个 greps 的输出

bash - Unix 使用 comm 比较两个 CSV 文件

php - 使用连接表进行 codeigniter 搜索

linux - 如何通过 unix shell 脚本从远程服务器为特定用户发送电子邮件

bash 轮分钟到 5

python - MLFlow 项目; bash : python: command not found

c# - NHibernate/LINQ : how to write this JOIN query?