GNU/Linux >> Linux の 問題 >  >> Linux

Linuxで2つのファイルの違い(追加のみ)を取得する方法

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

       [...]

Linux
  1. Linux の find コマンドを使用してファイルを検索する方法

  2. 2 つの XML ファイルを比較するにはどうすればよいですか?

  3. 2 つのファイルの最初の行だけを比較するには?

  1. Linuxで2つのテキストファイルを結合する方法

  2. Linux – 2回の間に作成されたファイルを削除する方法は?

  3. Linuxでファイルの物理サイズを取得するには?

  1. Linux ですべてのスパース ファイルを見つける方法

  2. bashで2つの日付の違いを取得するにはどうすればよいですか

  3. Linux で同じサイズの 2 つのファイルのバイナリ diff を実行するにはどうすればよいですか?