コンソール上でファイルを比較した際、片方にしかない行のみを抜き出したい場合があったので備忘として残しておく。
1.commコマンドを使う
一番簡単なのが、commコマンドを使ってやる方法だろう。
commコマンドでは、比較するファイルを引数で指定することで以下のように出力される。
comm --nocheck-order ファイル1 ファイル2
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test1.txt
aaaa
bbbb
cccc
dddd
blacknon@BS-PUB-UBUNTU-01:~$ cat /tmp/test2.txt
aaaa
9999
cccc
dddd
eeee
dddd
blacknon@BS-PUB-UBUNTU-01:~$ comm --nocheck-order /tmp/test1.txt /tmp/test2.txt
aaaa
9999
bbbb
cccc
dddd
eeee
dddd
少しわかりやすいように色のついた枠で囲っているのだが、一番左がファイル1のみに存在する行、真ん中がファイル2のみに存在する行。そして最後の列が共通行だ。
で、このcommコマンドでは、「-列番号」でその列を除外して出力することができる。
つまり、ファイル2にのみ存在する行を出力したい場合は、以下のようにする。
comm -13 --nocheck-order ファイル1 ファイル2
blacknon@BS-PUB-UBUNTU-01:~$ comm -13 --nocheck-order /tmp/test1.txt /tmp/test2.txt
9999
eeee
dddd
2.diffコマンドで抽出する
commコマンドではなく、diffコマンドを使って同様のことを行う場合、少し記述が長くなる。
diffコマンドでは、「-y」オプションを付与することでファイルを並列に出力して差異を確認することができる。
diff -y ファイル1 ファイル2
blacknon@BS-PUB-UBUNTU-01:~$ diff -y /tmp/test1.txt /tmp/test2.txt
aaaa aaaa
bbbb | 9999
cccc cccc
dddd dddd
| eeee
> dddd
で、この状態で出力をすると真ん中の列に「<|>」といった記号でどういった内容の行なのかを表現してくれてるので、片方にしかない行を表示させる場合はそれを利用すればよい。
この際、「changed-group-format」オプションでこの記号を指定してやることで、どちらかにしかない行を表示させることができる。以下のコマンドでは、ファイル2にしかない行を表示させている。
diff --changed-group-format='%>' --unchanged-group-format='' ファイル1 ファイル2
blacknon@BS-PUB-UBUNTU-01:~$ diff --changed-group-format='%>' --unchanged-group-format='' /tmp/test1.txt /tmp/test2.txt
9999
eeee
dddd