commコマンドすごい

とか感動してたら
とリプライをもらって、commってなんだあ?と思ったので調べて使ってみました。
環境:Ubuntu 10.10 64bit / comm ver.8.5 (GNU coreutils)

commって?

2つのファイル(このうち片方は標準入力にできる)を比較して、一致する行、片方のファイルにのみ存在する行を出力するコマンドです。(前提としてソートされていること)

使い方と出力

$ cat <<EOB > aaa
aaa
bbb
ccc
ddd
eee
EOB
$ cat <<EOB > bbb
ccc
eee
xxx
zzz
EOB
$ comm aaa bbb  # "$ cat aaa | comm - bbb" でもOK

2つのファイルを引数に渡します。
すると出力が以下のようになります。

aaa
bbb
		ccc
ddd
		eee
fff
	xxx
	zzz

一番左がaaaにしか存在しない行、中央がbbbにしか存在しない行、一番右が2つのファイルに存在する行です。
commへのパラメータとして-1を渡すと一番左のみ出力しない、-2を渡すと中央のみ出力しない、-3で一番右のみ出力しない、となります。


ちなみにタブ区切りなので標準出力をtsvとして出力するとすごく幸せになれると思います。
trでコンマに変換してcsvでもいいかも。


まさに突き合わせをするシェルスクリプトを書こうと思っていた矢先に教えてもらってよかった!