bash: 2つのテキストファイルの差分がわかるコマンド
例えば被験者リスト同士の差分を知りたいときなどに便利です。
以下のような2つのファイルがあったとします。
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を使って視覚的に見比べられるツールも便利です。
ただこちらもテキスト内での位置なども考慮されるので、単純に差分だけを出してくれるというわけではありません。
シンプルに差分だけを知りたいときにはやはりgrepが使いやすいかもしれません。
この記事が気に入ったらサポートをしてみませんか?