31

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

37

Не уверен, что один только diff может сделать это, но вы всегда можете использовать мощь других утилит GNU, чтобы помочь вам.

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

Это делает различия, а затем выбирает только те строки , которые начинаются с «-» - те изменены и имеют значение из diffa.txt файла, затем sed просто удалить эти «-» знаки.

Edit: после нескольких экспериментов с diff , похоже, что команда ниже производит то, что вы хотите:

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

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

2

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .