Вывод списка строк из одного файла в DIFF

34

Я хотел бы получить (GNU) DIFF для распечатки только строк, которые отличаются в одном файле. Так дано

    ==> 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
вовремя
источник
Страница man определенно немного лаконична с этими флагами! Хороший вопрос.
quickshiftin
1
Я хотел бы отметить, что 'info diff' даст полные примеры, в информации много информации.
Баруди Сафвен,

Ответы:

42

Не уверен, что 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
Вава
источник
Для одного из трубы метод в порядке. Я бы предпочел `perl -ne" print, если s / ^ - // "`, но это вкус. Я думаю, что я вижу, что --changed-group-format='%<'делают для меня сейчас ...
justintime
Спасибо. : D Мне нужно что-то вроде этого, чтобы перечислить все мои пакеты между двумя компьютерами, и я использовал sdiff, но это выглядит немного лучше.
Роб
12

Более простой способ - использовать 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

hukko
источник
Я обнаружил, что это намного проще, чем diffто, что я делаю не так, как ожидал. И я считаю, что он предустановлен как на BSD (то есть Mac OS X), так и на Ubuntu, так что никаких проблем с диспетчером пакетов не возникает.
Шридхар Сарнобат
3

Я хотел бы отметить, что commожидает отсортированные входные файлы и, следовательно, сообщает о результатах, отличных от diff.

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

универсален. Слава @vava

PSchwede
источник