4

Если у меня есть файл A содержащий список полей:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25

И еще один файл B содержащий список полей:

2017-04-23
2017-04-30
2017-05-07
2017-05-14
2017-05-21
2017-05-28
2017-06-04
2017-06-11
2017-06-18
2017-06-25
2017-07-02
2017-07-09
2017-07-16
2017-07-23

Как я могу быстро различить эти два файла, где я хочу знать все поля в файле B которых нет в файле A?

Это не обычный diff, где я хочу видеть относительную разницу между файлами, а скорее сравнение хешей, где каждая строка является записью на карте. Я хочу получить список всех строк в файле B которых нет в файле A чтобы я мог удалить их, если каждая строка в файле A представляет каталог, который должен быть сохранен.

Я ищу решение Bash/CoreUtils.

3 ответа3

3

Если ваши файлы отсортированы, вы можете использовать comm:

$ comm -13 A B
2017-07-02
2017-07-09
2017-07-16
2017-07-23

с вариантами:

  • -1: подавить столбец 1 (строки уникальные для FILE1)
  • -3: подавить столбец 3 (строки, которые появляются в обоих файлах)
2

grep - правильный инструмент для работы, хотя это не Bash или CoreUtils:

grep -Fxvf A B

Все эти опции соответствуют POSIX. От man 1 grep:

-f pattern_file

Прочитайте один или несколько шаблонов из файла с именем pattern_file . Шаблоны в pattern_file должны заканчиваться символом. Нулевой шаблон может быть указан пустой строкой в pattern_file. Если также не указана опция -E или -F , каждый шаблон должен рассматриваться как BRE, как описано в томе Базовых определений POSIX.1-2008, раздел 9.3, Основные регулярные выражения.

-F

Совпадение с использованием фиксированных строк. Обрабатывайте каждый шаблон, указанный как строку, а не регулярное выражение. Если входная строка содержит какой-либо из шаблонов в виде непрерывной последовательности байтов, строка должна быть сопоставлена. Нулевая строка должна соответствовать каждой строке.

-v

Выберите линии, не соответствующие ни одному из указанных шаблонов. Если опция -v не указана, выбранные строки должны соответствовать тем, которые соответствуют любому из указанных шаблонов.

-x

Рассматривайте только те входные строки, в которых используются все символы в строке, за исключением окончания, которое соответствует целой фиксированной строке или регулярному выражению, которые соответствуют строкам.

1

Еще один способ с некоторыми трубами

cat A B|sort|uniq -u

редактировать UUOC

Нет необходимости в кошке

sort A B|uniq -u

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