1. 概要

2つのファイルの内容を比較する必要がある場合があります。 おそらく、重複するファイルが2つあり、1つを削除する前に、それらに同じデータが含まれていることを確認する必要があります。

このチュートリアルでは、commコマンドについて説明します。 このツールを使用すると、2つのファイルを1行ずつスクロールしなくても比較できます。

2. commとは何ですか?

comm コマンドには2つのファイル名が必要であり、それを比較して、データの一意性に応じて3つの列を返します。 最初の列はfile1の一意の値、2番目はfile2の一意の値、3番目は両方のファイルで同じ値です。

diff コマンドは似ていますが、ファイルの比較に使用できるコマンドがより複雑です。 comm を使用すると、出力が簡単になり、関数が使いやすくなります。 comm のシンプルさは、スクリプトでの使用により適している理由です。

comm コマンドを実行する前に、ファイルの内容が両方ともソートされていることを確認する必要があります。 そうしないと、エラーが返され、正しい出力が表示されません。 このチュートリアルの後半で、データを並べ替える方法を見ていきます。

3. 入出力

ファイルをフォーマットする必要がない場合は、 comm コマンドを実行してから、比較したい2つのファイル名を実行します。

$ comm file1 file2

3.1. テストファイル

comm コマンドを使用して両方のコンテンツを比較できるように、次の2つのファイル(file1file2)を作成しましょう。

$ cat <<EOF> file1
> Cat
> Dog
> Pony
> fish
> EOF
$ cat <<EOF> file2
> fish
> dog
> hamster
> Pig
> EOF

これらのコマンドは、file1file2を意図的にアルファベット順に作成しないため、後でこれらの値を並べ替える方法を確認できます。

3.2. ファイルの並べ替え

commコマンドが正しく機能するには、同じ並べ替え標準を使用してファイルを並べ替える必要があります。

両方のファイルを正しく並べ替えると、コマンドはエラーなしで期待どおりに実行されます。 ただし、ファイルを並べ替えないと、最初の並べ替えられていない値で、ファイルNが並べ替えられていないことを示すエラーが発生します。

ファイルの残りのコンテンツは出力されますが、期待どおりに残りのコンテンツは比較されません。

$ comm file1 file2
Cat
Dog
        fish
comm: file 2 is not in sorted order
        dog
        hamster
        Pig
Pony
comm: file 1 is not in sorted order
fish

ファイルがまだソートされていない場合は、ソートコマンドを使用できます。

知っています sortは、ソートされた値のリストを出力します 、使用できます <() 両方からの出力を置き換える構文選別 2つのファイルのコマンド。

comm コマンドは、ソートされていないリストではなく、ソートされたリストの比較を実行します。

$ comm <(sort file1) <(sort file2)
Cat
        dog
Dog
                fish
        hamster
        Pig
Pony

3.3. 非表示にする比較の指定

出力に表示したくない列を指定できます。 これを行うには、マイナス(-)の後に、非表示にする列を追加する必要があります。

たとえば、列3(「両方」の列)のみを表示する場合は、列1と2を非表示にすることができます。

$ comm -12 <(sort file1) <(sort file2)
fish

これで、両方のファイルが共有する唯一のエントリが「魚」であることがはっきりとわかります。

3.4. 大文字と小文字の区別を無視する

前の例を見ると、両方のファイルが「犬」という単語をそれぞれで一意として返すことがわかりました。

commコマンドでは大文字と小文字が区別されます。 両方の値が完全に同じでない場合は、両方のファイル列に一意の値として表示されます。

2つのファイルに大文字と小文字の違いがある場合は、 tr コマンドをインラインで使用して、commコマンド内で両方を小文字に変換できます。

$ comm <(sort <(tr '[:upper:]' '[:lower:]' < file1)) <(sort <(tr '[:upper:]' '[:lower:]' < file2))
cat
                dog
                fish
        hamster
        pig
pony

4. 結論

この短いチュートリアルでは、commコマンドの用途と使用方法を学びました。

追加オプションの詳細については、commのマニュアルページを参照してください。