Команда 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.