読者です 読者をやめる 読者になる 読者になる

write ahead log

ロールフォワード用

commコマンド[POSIXコマンド]

ShellScript/POSIX

commコマンドは2つのファイルを行単位で単純比較します. 単純比較なので事前ソートが必須です.

#サンプル用ファイル1
$ cat text1.txt 
1
2
3
4hoge
5

#サンプル用ファイル2
$ cat text2.txt 
1
2foo
3
4
5

上記2ファイルに対して実行すると

$ comm text1.txt text2.txt 
        1
2
    2foo
        3
    4
4hoge
        5

結果が3列に分けて表示される.

列番 内容
1 file1の内容のみにあるもの
2 file2の内容のみにあるもの
3 両方のファイルにあるもの

オプション

毎回3列出されても鬱陶しい時は抑制オプションがある.

オプション 内容
-1 file1の内容のみにあるものは出さない
-2 file2の内容のみにあるものは出さない
-3 両方のファイルにあるものは出さない

$ comm -1 text1.txt text2.txt 
    1
2foo
    3
4
    5
$ comm -2 text1.txt text2.txt 
    1
2
    3
4hoge
    5
$ comm -3 text1.txt text2.txt 
2
    2foo
    4
4hoge

ちなみに冒頭に書いた通り,単純比較なのでファイルの末尾に改行コードが入っているとソートされていないとみなして下記のような警告を吐いてきます.

comm: ファイル 1 がソートされていません
comm: ファイル 2 がソートされていません

その他の指定

引数に'-'(ハイフン)を渡すと標準入力からの入力になります. (第一,第二どちらでも指定可能)

$ cat text2.txt | comm text1.txt -
        1
2
    2foo
        3
    4
4hoge
        5

$ cat text1.txt | comm - text2.txt 
        1
2
    2foo
        3
    4
4hoge
        5

中々使えそうなコマンドです.