Unix команда, чтобы найти пересечения строк или выбросы? - PullRequest
20 голосов
/ 19 июня 2009

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

sort | uniq

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

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

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

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

file1:

mom
dad
bob

file2:

dad

% пересекать файл1 файл2

dad

% left-unique file1 file2

mom
bob

Ответы [ 6 ]

37 голосов
/ 19 июня 2009

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

$ comm -12 file1 file2

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

$ comm file1 file2

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

  1. строк только в файле1
  2. строк только в файле2
  3. строк как в файле1, так и в файле2

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

9 голосов
/ 19 июня 2009

Intersect:

# sort file1 file2 | uniq -d
dad

Слева:

# sort file1 file2 | uniq -u
bob
mom
5 голосов
/ 20 августа 2012

С 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 читать шаблоны для поиска из файла. Это означает, что он выполняет поиск file2 для каждой строки в file1.
  • Опция -F указывает grep видеть поисковые термины как фиксированные строки, а не как шаблоны, так что a.c будет соответствовать только a.c, а не abc,
  • Опция -x указывает grep выполнять поиск всей строки, так что «foo» в file1 не будет совпадать с «foobar» в file2.
  • По умолчанию grep будет показывать только совпадающие линии, давая вам пересечение. Опция -v указывает grep показывать только несоответствующие строки, давая вам строки, уникальные для file2.
5 голосов
/ 19 июня 2009

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

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

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

или с подстановочными знаками для имен файлов в зависимости от ситуации.

2 голосов
/ 19 июня 2009

от человека grep

-L, --files-without-match

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

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

grep -L '{% load i18n %}' *.html
1 голос
/ 22 мая 2018

Пересечения:

comm -12 <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

Все строки по 3 столбцам (файл1 | файл2 | пересечение):

comm <(cat file1 | sort | uniq) <(cat file2 | sort | uniq)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...