commは、2 つのファイルを比較して共通行と相違行を検出するシェルコマンドです。ファイルをテキスト行として読み込み、3 つの列として出力します。最初の 2 つの列には、それぞれ最初のファイルと 2 番目のファイルに固有の行が含まれます。最後の列には、両方のファイルに共通する行が含まれます。列は通常、タブ文字で区切られます。入力テキストに区切り文字で始まる行が含まれている場合、出力列があいまいになる可能性があります。
効率化のため、標準的な実装では、comm両方の入力ファイルが同じ行照合順序で、字句順にソートされていることを前提としています。sortこの目的には、コマンドを使用できます。このアルゴリズムは、現在のロケールcommの照合順序を利用します。ファイル内の行が両方とも現在のロケールに従って照合されていない場合、結果は未定義となります。
このコマンドはPOSIX標準で規定されています。1980年代半ばから後半にかけて、Unix 系オペレーティングシステムで広く利用されるようになりました。元々はLee E. McMahonによって実装され、 Version 4 Unixで初めて登場しました。[ 1 ] GNU coreutilsのバージョンはRichard Stallmanと David MacKenzieによって作成されました。[ 2 ]
キャットフーアップル バナナナスキャットバーアップルバナナバナナズッキーニコムフーバー アップル バナナ バナナ ナスズッキーニ これは、どちらのファイルにもバナナが1本ずつ含まれているが、barファイルのみに2本目のバナナが含まれていることを示している。
さらに詳しく説明すると、出力ファイルは次のようになります。列は先頭のタブ文字の数によって解釈されることに注意してください。\t はタブ文字を表し、\n は改行を表します (エスケープ文字#プログラミングとデータ形式)。
次の出力行を書き込む前に、行比較中は各入力ファイルから最大1行分をバッファリングする必要がある。
readlinebuffer()システムメモリが十分であれば、行長の制限を設けない関数を使用して行を読み込む実装もあります。
他の実装では、関数を使用して行を読み取ります。この関数は固定バッファを必要とします。これらの実装では、バッファのサイズはPOSIXマクロfgets()に従って設定されることがよくあります。LINE_MAX
もファイル比較コマンドですが、diffとは大きく異なる情報を表示しますcomm。一般的に、diffは よりも強力ですcomm。よりシンプルな は、commスクリプトでの使用に最適です。
と の主な違いはcomm、はソート前に行の順序に関する情報を破棄するdiff点です。comm
と のわずかな違いはcomm、 は2 つのファイル間で行が変更されたことを示そうとしないdiffことですcomm。行は「ファイル #1 から」、「ファイル #2 から」、または「両方」の列に表示されます。これは、わずかな違いしかない場合でも 2 つの行を異なるものとして扱いたい場合に便利です。
とは異なりdiff、の終了コードはcommファイルが一致するかどうかを示しません。通常どおり、0は成功を示し、その他の正の値はエラーを示します。