見出し画像

bash: 2つのテキストファイルの差分がわかるコマンド

例えば被験者リスト同士の差分を知りたいときなどに便利です。

以下のような2つのファイルがあったとします。

file1.txt

パンダ
カエル
キリン
オオカミ
カバ

file2.txt

カエル
オオカミ
リス
パンダ
ネコ

file1にあってfile2にないものを知りたいとき、どうすればいいでしょうか?

色々な方法があると思いますが、grepというコマンドを使うと一瞬でわかります。

grep -Fxv -f file2.txt file1.txt

キリン
カバ

ポイントは-f file2.txtの部分です。file2.txtの内容を1行ずつパターンとして使って探してくれます。-Fxvの部分は

  • -F:固定文字列として扱う(正規表現ではなくそのままの文字列をマッチさせる)

  • -x:行全体を一致させる(部分一致ではなく完全一致)

  • -v:マッチしない行を表示する

検索対象のfile1からfile2の中身にマッチしない行を表示する、つまりfile1にあってfile2にない行を表示してくれます。

逆にfile2にあってfile1にないものを知りたいときは


grep -Fxv -f file1.txt file2.txt

リス
ネコ

となります。

では両方にあるものはどうなるでしょうか。


grep -Fx -f file1.txt file2.txt

カエル
オオカミ
パンダ

-v:マッチしない行を表示する なので、vだけを取り去るとマッチする行を表示してくれます。

どちらの場合も、重複があっても1回だけ表示されます。

他の方法としてはdiffコマンドもあります。
名前がわかりやすく、多機能なコマンドですが出力がやや直感的ではありません。
diff -yと-yオプションをつけるとちょっとわかりやすくなります。
上記の例だと

diff -y file1.txt file2.txt 

出力は以下の通りです。

パンダ                 <
カエル                 カエル
キリン                 <
オオカミ                オオカミ
カバ                          | リス
                    > パンダ
                    > ネコ

左側のfile1に対して右側のfile2でなくなったものは<、増えたものは>、違うものになった場合は|の記号で表されます。
diffコマンドを使う場合、並び順を考慮しないで求めるためには、sortコマンドでソートしてから比べる必要があります。

その他にはmeldというGUIを使って視覚的に見比べられるツールも便利です。

インストールはこちら。https://meldmerge.org/

ただこちらもテキスト内での位置なども考慮されるので、単純に差分だけを出してくれるというわけではありません。
シンプルに差分だけを知りたいときにはやはりgrepが使いやすいかもしれません。

この記事が気に入ったらサポートをしてみませんか?