Подтвердить что ты не робот

Как получить разницу (только добавления) между двумя файлами в Linux

У меня есть два файла A1 и A2 (unsorted). A1 - это предыдущая версия A2, и некоторые строки были добавлены к A2. Как я могу получить новые строки, добавленные в A2?

Примечание. Я просто хочу, чтобы новые строки добавлены и не нужны строки, которые были в A1, но удалены в A2. Когда я делаю diff A1 A2, я получаю дополнения и удаления, но хочу только добавления.

Пожалуйста, предложите способ сделать это.

4b9b3361

Ответ 1

diff, а затем grep для нужного типа редактирования.

diff -u A1 A2 | grep -E "^\+"

Ответ 2

Все приведенное ниже копируется непосредственно из @TomOnTime serverfault answer здесь:

Показать строки, которые существуют только в файле a: (то есть, что было удалено из a)

comm -23 a b

Показать строки, которые существуют только в файле b: (то есть, что было добавлено в b)

comm -13 a b

Показать строки, которые существуют только в одном файле: (но не оба)

comm -3 a b | sed 's/^\t//'

(Предупреждение: если файл a имеет строки, начинающиеся с TAB, он (первая TAB) будет удаляться из вывода.)

ПРИМЕЧАНИЕ. Оба файла должны быть отсортированы для правильной работы "comm". Если они еще не отсортированы, вы должны отсортировать их:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

Если файлы чрезвычайно длинные, это может быть довольно тяжелым бременем, поскольку для этого требуется дополнительная копия и, следовательно, вдвое больший объем дискового пространства.

Изменить: обратите внимание, что команда может быть написана более кратко с помощью замены процесса (благодаря @phk для комментария):

comm -12 <(sort < a) <(sort < b)

Ответ 3

Вы можете попробовать это

diff --changed-group-format='%>' --unchanged-group-format='' A1 A2

Опции документированы в man diff:

       --GTYPE-group-format=GFMT
              format GTYPE input groups with GFMT

а также:

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

а также:

              GFMT (only) may contain:

       %<     lines from FILE1

       %>     lines from FILE2

       [...]

Ответ 5

Вы можете ввести:

grep -v -f A1 A2

Ответ 6

git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2-
  • grep -E "^\+" из предыдущего принятого ответа, он неполный, потому что оставляет не исходный материал.
  • grep -v '+++ b' удаляет неиспользуемую строку с именем файла более поздней версии
  • cut -c 2- удаляет столбец знаков +, также может использовать sed 's/^\+//'

comm или sdiff не были опцией из-за git.

Ответ 7

Подобный подход к merp, но, надеюсь, более понятный и легко настраиваемый:

diff \
  --new-line-format="- %L" \
  --old-line-format="" \
  --unchanged-line-format="" \
  A1 A2