diff
そして grep
diff -u A1 A2 | grep -E "^\+"
https://stackoverflow.com/a/15385080/337172 と同様のアプローチですが、うまくいけば、より理解しやすく、簡単に調整できます:
diff \
--new-line-format="%L" \
--old-line-format="" \
--unchanged-line-format="" \
A1 A2
以下のほとんどは、@TomOnTime の serverfault answer here から直接コピーされています。下部には、ソートされていないファイルで機能する試みがありますが、コマンドは差分を与える前にファイルをソートするため、多くの場合、それは望ましいものではありません。ソートされていないファイルの適切にフォーマットされた差分については、他の回答がより役立つかもしれません (これを指摘してくれた @Fritz に感謝します):
ファイル a:にのみ存在する行を表示:(つまり、a から削除されたもの)
comm -23 a b
ファイル b にのみ存在する行を表示:(つまり、b に追加されたもの)
comm -13 a b
どちらか一方のファイルにのみ存在する行を表示:(両方ではない)
comm -3 a b | sed 's/^\t//'
(警告:ファイル a
の場合 TAB で始まる行がある場合、それ (最初の TAB) は出力から削除されます。)
注:「comm」が正しく機能するためには、両方のファイルをソートする必要があります。まだソートされていない場合は、ソートする必要があります:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
ファイルが非常に長い場合、追加のコピーが必要になり、2 倍のディスク容量が必要になるため、かなりの負担になる可能性があります。
編集:コマンドは、プロセス置換を使用してより簡潔に記述できることに注意してください (コメントについては @phk に感謝します):
comm -12 <(sort < a) <(sort < b)
これを試すことができます
diff --changed-group-format='%>' --unchanged-group-format='' A1 A2
オプションは man diff
に文書化されています :
--GTYPE-group-format=GFMT
format GTYPE input groups with GFMT
そして:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
そして:
GFMT (only) may contain:
%< lines from FILE1
%> lines from FILE2
[...]