web-dev-qa-db-ja.com

DIFFの1つのファイルのみから行をリストする

(GNU)DIFFで、1つのファイル内で異なる行だけを印刷したいと思います。だから与えられた

    ==> diffa.txt <==
    line1
    line2 - in a only
    line3
    line4 changed
    line5

    ==> diffb.txt <==
    line1
    line3
    line4 changed in b
    line5
    line6 in b only

をお願いします diff --someoption diffa.txt diffb.txt生産する

    line2 - in a only

    line4 changed

以下は、それが役立つはずのように見えますが、少し不可解です:

   --GTYPE-group-format=GFMT
          Similar, but format GTYPE input groups with GFMT.

   --line-format=LFMT
          Similar, but format all input lines with LFMT.

   --LTYPE-line-format=LFMT
          Similar, but format LTYPE input lines with LFMT.

   LTYPE is `old', `new', or `unchanged'.
          GTYPE is LTYPE or `changed'.

          GFMT may contain:

   %<     lines from FILE1

   %>     lines from FILE2
35
justintime

diffだけでそれができるかどうかはわかりませんが、他のGNUユーティリティの力をいつでも使用できます。

diff -u diffa.txt diffb.txt | grep '^-[^-]' | sed 's/^-//'

それはdiffを行い、次に '-'で始まる行のみを選択します-それらは変更され、diffa.txtファイルからの値を持ち、次にsedはそれらの '-'記号を削除します。

編集:diffをいくつか試した後、次のコマンドで必要なものが生成されるように見えます。

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
44
vava

より簡単な方法は、comm linuxユーティリティを使用することです(入力にはソートされたファイルが必要です)。標準出力に書き込みます。

  • diffa.txtに固有の行

  • diffb.txtに固有の行

  • 一般的なライン

それに応じて、パラメーター1、2、または3でそれぞれを抑制できます。したがって、あなたの場合は次のようになります:

comm -23 diffa.txt diffb.txt

これは、diffb.txtに固有の行、共通の行を抑制し、diffa.txtにのみ固有の行を出力します。

ソース:https://www.tutorialspoint.com/unix_commands/comm.htm

13
hukko

commはソートされた入力ファイルを想定しているため、diffとは異なる結果を報告することを述べておきます。

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

普遍的です。 @vavaへの称賛

4
PSchwede