Рядки з лише одного файлу у 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

Сторінка чоловіка, безумовно, трохи стисла на цих прапорах! Гарне питання.
quickshiftin

1
Я хотів би зазначити, що "info diff" дасть повні приклади, в інформації є безліч інформації.
Baroudi Safwen

Відповіді:


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, якщо s / ^ - // "`, але це смак. Я думаю, що я бачу, що --changed-group-format='%<'для мене зараз роблять ....
вчасно,

Спасибі. : DI потрібно було щось подібне, щоб перерахувати всі мої пакети між двома комп'ютерами, і я використовував 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


Я знайшов це набагато простіше, ніж те, diffщо не робить те, що я очікую І я вважаю, що він попередньо встановлений як на BSD (тобто Mac OS X), так і на Ubuntu, тому немає кошмарів менеджера пакунків.
Шрідхар Сарнобат

3

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

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

є універсальним. Кудос до @vava

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.