Linuxでファイルを比較して片方にしかない内容のみ抜き出す
Pocket

コンソール上でファイルを比較した際、片方にしかない行のみを抜き出したい場合があったので備忘として残しておく。

1.commコマンドを使う

一番簡単なのが、commコマンドを使ってやる方法だろう。
commコマンドでは、比較するファイルを引数で指定することで以下のように出力される。

comm --nocheck-order ファイル1 ファイル2

20161118_225417000000

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
Sponsored Links

2.diffコマンドで抽出する

commコマンドではなく、diffコマンドを使って同様のことを行う場合、少し記述が長くなる。
diffコマンドでは、「-y」オプションを付与することでファイルを並列に出力して差異を確認することができる。

diff -y ファイル1 ファイル2

20161119_000655000000

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

 

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。