かべぎわブログ

技術的なことについてかけたらいいな…

diffで差分がないところだけ出力する

今回はdiffで差分がないところだけ出力してみます。

前提

比較するファイルは以下のようなものを用意しています。

$ cat foo.txt
AAAAA
BBBBB
CCCCC
$ cat bar.txt
CCCCC
DDDDD
EEEEE

実行コマンド

以下のコマンドでdiffで差分のない部分だけを出力することができます。

$ diff --old-line-format='' --unchanged-line-format='%L' --new-line-format='' foo.txt bar.txt
CCCCC

共通部分CCCCCだけが出力できました!

ちょっとした解説

diffにいろいろな長いオプションをつけていてよくわからないと思いますので解説していきます。
まず、今回はdiffのif-then-else形式と呼ばれる形式で差分を表示しています。
(-D--old-line-formatなどのオプションを指定してあげるとその形式になります。)

if-then-else形式とは以下のように比較結果を出力する形式です。

$ diff -D=test foo.txt bar.txt
#ifndef =test
AAAAA
BBBBB
#endif /* ! =test */
CCCCC
#ifdef =test
DDDDD
EEEEE
#endif /* =test */

続いてそれらで利用しているオプションの解説です。
--old-line-format=''は1番目のファイルだけにある行の出力のフォーマットを決めるオプションです。
これを''とすることで出力しないようにしています。

--new-file-format=''も同様です。
2番めのファイルの出力をしないように指定しています。

--unchanged-line-format='%L'は両方のファイルに共通な行を出力する際のフォーマットです。
%Lはman diff曰く

%L contents of line

とのことです。
行の内容をそのまま出力する。という意味で利用しています。

おわりに

共通部分を出力するだけなのにコマンドとしては少し長くなってしまいますが、シェルスクリプト内などで利用すると結構便利だったりするのではないでしょうか?

おためしください!!!

「シェル芸」に効く!AWK処方箋

「シェル芸」に効く!AWK処方箋