はじめに
以下のような2つのファイルがある場合に内容を比較して変更箇所のみ取得する方法について記載します。
old.txt
変更なし
変更なし
変更なし
new.txt
変更なし
変更なし
変更あり
追加
追加
追加
diff
コマンド
diff
コマンドを使用して次のように実行することで変更箇所のみ取得できます。
$ diff --old-line-format='' --unchanged-line-format='' --new-line-format='%L' old.txt new.txt
変更あり
追加
追加
追加
-
--old-line-format
1番目のファイルだけにある行の出力に使用するフォーマットを設定する。 -
--unchanged-line-format
両方のファイルに共通な行の出力に使用するフォーマットを設定する。 -
--new-line-format
2番目のファイルだけにある行の出力に使用するフォーマットを設定する。 -
%L
行頭などに何もつけず1行ずつ出力する。
+%L
とすると以下のようになります。$ diff --old-line-format='' --unchanged-line-format='' --new-line-format='+%L' old.txt new.txt +変更あり +追加 +追加 +追加
また
%l
とすると以下のようになります。$ diff --old-line-format='' --unchanged-line-format='' --new-line-format='%l' old.txt new.txt 変更あり追加追加追加
comm
コマンド
comm
コマンドを使用して次のように実行しても変更箇所のみ取得できます。
$ comm -13 old.txt new.txt
変更あり
追加
追加
追加
-
-13
old.txt
のみに含まれる行と両方のファイルに含まれる行を出力しないようにする。
すなわち変更や追加があった行のみ出力する。
ただしファイルがsort
されていない正しく比較できず以下のようなエラーが出力されます。
comm: file 2 is not in sorted order
comm: input is not in sorted order
これを出力させないようにするにはsort
してからcomm
するかsort
する必要のない場合には以下のようにオプションを付けます。
comm --nocheck-order old.txt new.txt