bash:join和comm之间的区别

bash:join和comm之间的区别,bash,join,comm,Bash,Join,Comm,这两个文件都是字母数字字符串的单列和排序。它们不应该相同吗 更新了以下@Kevin-s的答案: # comm -12 /tmp/src /tmp/txt | wc -l 10338 # join /tmp/src /tmp/txt | wc -l 10355 结果是: cat /tmp/txt | sed 's/^[:space:]*//' > /tmp/stxt cat /tmp/src | sed 's/^[:space:]*//' > /tmp/ssrc 在手动检

这两个文件都是字母数字字符串的单列和排序。它们不应该相同吗


更新了以下@Kevin-s的答案:

# comm -12 /tmp/src /tmp/txt | wc -l
  10338
# join /tmp/src /tmp/txt | wc -l
  10355
结果是:

cat /tmp/txt | sed 's/^[:space:]*//' > /tmp/stxt
cat /tmp/src | sed 's/^[:space:]*//' > /tmp/ssrc
在手动检查
diff
-s时。。。由于
sed
没有删除某些空白,因此结果有所不同

我也没有广泛使用过这两个文件,但从手册页和测试输入来看,如果这两个文件不同,comm会同时打印这两个文件,join只会打印匹配的行。12号负责处理这件事。您可以将这两个文件的输出存储到文件中,并进行差异分析,以查看它们之间的差异

#join /tmp/ssrc /tmp/stxt | wc -l
516
# comm -12 /tmp/ssrc /tmp/stxt | wc -l
513
编辑:
Join只比较第一个空格分隔的字段,而comm比较整行。因此,行上的任何空白都会使输出不同

连接的主要功能是选择共享一个字段的行,就像在数据库中一样。假设您有以下文件:

$ echo -e '1\n2\n3\n5' > a
$ echo -e '1\n2\n4\n5' > b
$ comm a b
                1
                2
3
        4
                5
$ join a b
1
2
5
$

。。。您可以从文件A中选择“John”和“Bill”行,方法是将文件B指定为要联接的文件,并将两者的第一个字段指定为要联接的字段。要求两个文件都必须在该字段上排序,这在实践中是相当麻烦的。

但是,
comm
join
之间有一些区别:

  • comm
    比较整条线路<代码>联接比较行内的字段
  • comm
    打印整行<代码>连接可以打印行的选定部分
  • 当每个文件中只有一列数据时,差异相对较小。当您有多个列时,可能会有很大的差异

    还要注意,在正确的情况下,
    join
    可以从一个文件中输出多个数据副本,同时使用另一个文件中的不同行进行连接。这在我看来像是你的问题;其中一个文件中可能有一些重复的值。假设你有:

    File A
    Alice  24
    Bill   16
    Claire 31
    John   10
    John  -14
    
    File B
    Bill   Copenhagen
    John   Adelaide
    
    如果你做了
    comm-12src-txt
    ,你会得到一行输出;如果您加入src txt,您将得到三行输出。这是意料之中的

    join
    命令还可以处理第一个文件中某行的第二个文件中缺少数据的“外部联接”(SQL中的左外部联接),或者反之亦然(右外部联接),或者同时处理两个文件(完全外部联接)


    总之,
    join
    是一个更复杂的命令,但它正在尝试执行更复杂的任务。两者都是有用的;但是它们在不同的地方很有用。

    使用
    [[:space:][]
    (而不是
    [:space:][/code>)使用
    sed来去除空白

    src           txt
    123           123
                  123
                  123
    

    这真的不是bash问题。@keith Thompson它可能是命令特定的-但我在为bash脚本选择它们时遇到了它们。因此使用了标记。我使用
    comm-12
    来抑制FILE1、FILE2特有的行。
    diff
    -s太大-伤眼睛;)我明白了,我错过了。在进一步查看手册页之后,join在第一个空格分隔的字段上连接,而comm在整行上连接。输入文件中有空格吗?很好。。。我将尝试
    sed
    填充空格,看看是否有差异…:这些问题确实是由于胭脂空白造成的。使用对文件所做的更改更新了问题。我现在在手动检查中发现的结果之间的微小差异都是因为空格,我想知道为什么
    [:space://code>没有把它们去掉。Anyregex,你能更新你的答案让我接受吗?非常感谢:我知道胭脂在法语中代表红色,但我不知道-s to diff是什么意思。谢谢你的回答,真的很有用。我通常会在列上对-k
    进行排序,但使用
    join
    -从来都不舒服,我发现自己在编写长条
    awk
    关联数组来比较文件。。卢兹:D
    # compare
    {
    echo '   abc' | sed 's/^[:space:]*//'
    echo '   abc' | sed 's/^[[:space:]]*//'
    }