Есть ли какой-нибудь инструмент, который может получить строки, которые содержит файл A, а файл B - нет? Я мог бы сделать небольшой простой скрипт, например, с Perl, но если что-то подобное уже существует, я буду экономить свое время с этого момента.
command-line
маргаритка
источник
источник
Ответы:
Да. Стандартный
grep
инструмент для поиска файлов по текстовым строкам можно использовать для вычитания всех строк в одном файле из другого.Это работает, используя каждую строку в fileB как pattern (
-f fileB
) и обрабатывая ее как простую строку для соответствия (не регулярное регулярное выражение) (-F
). Вы заставляете совпадение происходить по всей строке (-x
) и выводите только те строки, которые не совпадают (-v
). Поэтому вы печатаете строки в файле A, которые не содержат те же данные, что и строки в файле B.Недостатком этого решения является то, что оно не учитывает порядок строк, и если ваш ввод содержит повторяющиеся строки в разных местах, вы можете не получить то, что ожидаете. Решением этой проблемы является использование реального инструмента сравнения, такого как
diff
. Это можно сделать, создав файл diff со значением контекста в 100% строк в файле, а затем проанализировав его только для строк, которые будут удалены при преобразовании файла A в файл B. (Обратите внимание, что эта команда также удаляет diff форматирование после того, как он получает правильные строки.)источник
-u
действительно принимает параметр числа, если за ним не стоит пробел. Преимущество того, что у меня было раньше, заключается в том, что оно будет работать со значением или без него, так что вы можете использовать что-то в подпрограмме подкоманды, которая не выдает результат. В верхнем регистре '-U', с другой стороны, требуется аргумент.diff
трубопровод работает лакомство спасибо.grep
как необходимо. Пример:grep -F -x -v -f <(sort fileB) <(sort fileA)
diff
заключается в том, что позиция в файле учитывается.Ответ во многом зависит от типа и формата файлов, которые вы сравниваете.
Если сравниваемые файлы являются отсортированными текстовыми файлами, то инструмент GNU, написанный Ричардом Столлманом и Дэвидом Маккензи,
comm
может выполнить фильтрацию, к которой вы стремитесь. Это часть coreutils.пример
Допустим, у вас есть следующие 2 файла:
Строки в файле
b
, которых нет в файлеa
:источник
comm
; к сожалению,comm
требуются отсортированные файлы<()
? Это работает, и я понимаю, но есть ли название для этой странности?<()
также известен как замена процесса .comm
Первоначально был написан около 1973 года кем-то из Bell Labs, а не RMS. Вы имеете в виду реализацию GNU, которая появилась намного позже. За эти годы было много разных реализаций утилит Unix.из stackoverflow ...
-23 подавляет строки, которые есть в обоих файлах или только в файле 2. Файлы должны быть отсортированы (они есть в вашем примере), но если нет, сначала передайте их через sort ...
Смотрите страницу руководства здесь
источник
Методы grep и comm (с сортировкой) занимают много времени на больших файлах. SiegeX и ghostdog74 поделились двумя замечательными методами awk для извлечения строк, уникальных для одного из двух файлов, в переполнении стека:
источник
Если файлы большие и у вас нет индивидуального порядка для ваших записей, grep занимает слишком много времени. Быстрая альтернатива будет
[file2-file1 результаты на экран, канал в файл и т. д.]
Переход
>
к<
получит противоположное вычитание.rm 1 2
источник
Вы также можете рассмотреть vimdiff, он подчеркивает различия между файлами в редакторе vim
источник