94

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

注:新しい行を追加したいだけで、A1にはあったがA2では削除された行は必要ありません。私がそうするときdiff A1 A2、私は追加と削除を取得しますが、私は追加だけが欲しいです。

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

4

7 に答える 7

109

以下のほとんどは、@TomOnTimeのserverfault回答から直接コピーされています。下部には、ソートされていないファイルで機能する試みがありますが、コマンドは差分を与える前にファイルをソートするため、多くの場合、それは望ましいものではありません。ソートされていないファイルの適切にフォーマットされた差分については、他の回答がより役立つ場合があります(これを指摘してくれた@Fritzに感謝します):

ファイル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)
于 2016-02-26T05:11:07.740 に答える
74

diff次にgrep、必要な編集タイプを選択します。

diff -u A1 A2 | grep -E "^\+"
于 2013-03-13T12:07:54.157 に答える
60

あなたはこれを試すことができます

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

       [...]
于 2013-03-13T12:16:50.260 に答える
9

https://stackoverflow.com/a/15385080/337172と同様のアプローチですが、うまくいけば、より理解しやすく、簡単に調整できます。

diff \
  --new-line-format="%L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2
于 2018-08-06T16:52:34.803 に答える
7

簡単な方法は次を使用することです:

sdiff A1 A2

もう1つの方法は、を使用することです。これは、Linuxでの2つのソートされていないリストの比較commでわかるように、2番目のファイルに一意のリストをリストします。

于 2013-03-13T12:09:26.877 に答える
7

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

grep -v -f A1 A2
于 2013-03-13T12:11:25.947 に答える
6
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
  • grep -E "^\+"以前に受け入れられた回答からのものですが、ソース以外のものを残すため、不完全です
  • grep -v '+++ b'それ以降のバージョンのファイル名を持つ非ソース行を削除します
  • cut -c 2-+標識の列を削除し、使用することもできますsed 's/^\+//'

commまたはsdiffgitのためにオプションではありませんでした。

于 2016-11-21T10:57:01.593 に答える