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

Я хотел бы получить (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

3 ответа

Решение

Точно сказать не могу 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

Более простой метод заключается в использовании 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

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

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

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

Другие вопросы по тегам