2
# comm -12 /tmp/src /tmp/txt | wc -l
  10338
# join /tmp/src /tmp/txt | wc -l
  10355

両方のファイルは、英数字の文字列とsort-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

-s ...を手動で検査すると、diffによって削除されなかった空白がいくつかあるため、結果が異なりますsed

4

4 に答える 4

6

との間にはいくつかの違いがcommありjoinます:

  1. comm行全体を比較します。join行内のフィールドを比較します。
  2. comm行全体を印刷します。join行の選択した部分を印刷できます。

各ファイルに1列のデータがある場合、違いは比較的小さくなります。複数の列がある場合、多くの違いが生じる可能性があります。

joinまた、適切な状況下では、他のファイルとは異なる行で結合しながら、1つのファイルからデータの複数のコピーを出力できることにも注意してください。これは私にはあなたの問題のように見えます。おそらく、ファイルの1つに重複する値がいくつかあります。あなたが持っているとしましょう:

src           txt
123           123
              123
              123

するとcomm -12 src txt、1行の出力が得られます。するとjoin src txt、3行の出力が得られます。これは予想されます。

このjoinコマンドは、最初のファイルの行の2番目のファイルからデータが欠落している「外部結合」(SQLではLEFT OUTER JOIN)またはその逆(RIGHT OUTER JOIN)、あるいはその両方を同時に処理することもできます(完全外部結合)。

全体としてjoin、より複雑なコマンドですが、より複雑な仕事をしようとしています。どちらも便利です。しかし、それらはさまざまな場所で役立ちます。

于 2011-08-29T19:23:27.377 に答える
2

の主なユーティリティはjoin、データベースで実行できるように、1つのフィールドを共有する行を選択することです。次のファイルがあるとします。

File A
Alice  24
Bill   16
Claire 31
John   10
John  -14

File B
Bill   Copenhagen
John   Adelaide

...結合するファイルとしてファイルBを指定し、結合するフィールドとして両方の最初のフィールドを指定することにより、ファイルAから「John」行と「Bill」行を選択できます。ただし、両方のファイルをそのフィールドでソートする必要があるという要件は、実際にはかなり面倒です。

于 2011-08-29T19:19:01.690 に答える
1

どちらもあまり使用していませんが、マニュアルページとテスト入力をざっと見てみると、2つのファイルが異なる場合、commは両方を印刷し、joinは一致する行のみを印刷するようです。 -12がそれを処理しました。2つの出力をファイルに保存し、差分を実行してそれらの違いを確認できます。

$ 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
$

編集:Joinは最初の空白で区切られたフィールドのみを比較しますが、commは行全体を比較します。したがって、行に空白があると、出力が異なります。

于 2011-08-29T18:23:56.547 に答える
1

[[:space:]](の代わりに)を使用[:space:]して、空白を。で削除しますsed

# compare
{
echo '   abc' | sed 's/^[:space:]*//'
echo '   abc' | sed 's/^[[:space:]]*//'
}
于 2011-08-30T11:23:53.947 に答える