web-dev-qa-db-ja.com

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

2つのファイルA1とA2(未ソート)があります。 A1はA2の以前のバージョンであり、A2にいくつかの行が追加されています。 A2に追加された新しい行を取得するにはどうすればよいですか?

注:新しい行を追加したいだけで、A1にあったがA2で削除された行は必要ありません。私がする時 diff A1 A2、追加だけでなく削除も取得しますが、追加のみが必要です。

これを行う方法を提案してください。

46
user1004985

diffを選択してから、目的の編集タイプのgrepを選択します。

diff -u A1 A2 | grep -E "^\+"
41
timrau

以下のすべては、@ TomOnTimeのserverfault answer here から直接コピーされます。

ファイル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)
46
scottkosty

これを試すことができます

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

       [...]
40
merp

次のように入力できます:

grep -v -f A1 A2
7
Zabador
6
Mihai8
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
  • grep -E "^\+"は以前に受け入れられた回答からのもので、ソース以外のものを残すため不完全です
  • grep -v '+++ b'は、新しいバージョンのファイル名を持つ非ソース行を削除します
  • cut -c 2-+記号の列を削除し、sed 's/^\+//'も使用できます

commまたはsdiffは、gitのためオプションではありませんでした。

5
user1046885

Merpと同様のアプローチですが、より理解しやすく、微調整しやすいことを願っています:

diff \
  --new-line-format="- %L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2
2
Francesc Rosas