Команда Unix для поиска пересечений строк или выбросов?

Есть ли команда UNIX с параметром

sort | uniq

чтобы найти пересечения строк или "выбросы".

Пример приложения: у меня есть список шаблонов html, у некоторых из них строка {% load i18n%} внутри, другие - нет. Я хочу знать, какие файлы нет.

edit: grep -L решает проблему выше.

Как насчет этого:

file1:

mom
dad
bob

file2:

dad

% пересекается file1 file2

dad

% left-unique file1 file2

mom
bob

Ответы

Ответ 1

Похоже, что grep -L решает реальную проблему плаката, но для фактического заданного вопроса, найдя пересечение двух наборов строк, вы можете заглянуть в команду "comm". Например, если file1 и file2 содержат список отсортированных слов, одно слово на строку, то

$ comm -12 file1 file2

создаст слова, общие для обоих файлов. В более общем плане, учитывая отсортированные входные файлы file1 и file2, команда

$ comm file1 file2

выводит три столбца вывода

  • строки только в файле1
  • строки только в файле2
  • в файлах file1 и file2

Вы можете подавить столбец N на выходе с помощью опции -N. Таким образом, команда выше, comm -12 file1 file2, подавляет столбцы 1 и 2, оставляя только слова, общие для обоих файлов.

Ответ 2

Intersect:

# sort file1 file2 | uniq -d
dad

Левая уникальность:

# sort file1 file2 | uniq -u
bob
mom

Ответ 3

Возможно, я не понимаю вопрос, но почему бы просто не использовать grep для поиска строки (используйте параметр -L, чтобы он печатал имена файлов, в которых нет строки).

Другими словами

grep -L "{% load i18n %}" file1 file2 file3 ... etc

или с подстановочными знаками для имен файлов, если это необходимо.

Ответ 4

от человека grep

-L, --files-without-match

Подавлять нормальный выход; вместо этого распечатать имя каждого входного файла, из которого никакого выхода, как правило, не было распечатаны. Сканирование остановится первый матч.

Итак, если ваши шаблоны - это файлы .html, которые вы хотите:

grep -L '{% load i18n %}' *.html

Ответ 5

Из http://www.commandlinefu.com/commands/view/5710/intersection-between-two-files:

Пересечение между двумя (несортированными) файлами:

grep -Fx -f file1 file2

Строки в файле2, которые не находятся в файле1:

grep -Fxv -f file1 file2

Пояснение:

  • Опция -f сообщает grep читать шаблоны, которые нужно искать из файла. Это означает, что он выполняет поиск файла2 для каждой строки в файле1.
  • Параметр -f сообщает grep, чтобы увидеть условия поиска как фиксированные строки, а не как шаблоны, так что a.c будет соответствовать только a.c, а не abc,
  • Опция -x сообщает grep делать целые поиски строк, так что "foo" в файле1 не будет соответствовать "foobar" в файле2.
  • По умолчанию grep будет показывать только соответствующие строки, давая вам пересечение. Опция -v сообщает grep показывать только несогласованные строки, предоставляя вам строки, которые уникальны для файла2.