поиск всех слов в текстовом файле, появляющемся в другом текстовом файле

Предположим, у меня есть два файла: a.txt и b.txt . Я хочу найти все слова в a.txt которые появляются в b.txt .

Есть ли конкретная команда для этого?

4 Solutions collect form web for “поиск всех слов в текстовом файле, появляющемся в другом текстовом файле”

С bash , zsh и некоторыми реализациями ksh :

 comm -12 <(tr -s '[:space:]' '[\n*]' < a.txt | sort -u) \ <(tr -s '[:space:]' '[\n*]' < b.txt | sort -u) 

Там слово – это последовательность символов без пробела (будьте осторожны с GNU tr , который не работает с многобайтовыми символами пробела).

comm находит общие линии между двумя отсортированными файлами. Без параметров он печатает 3 столбца: строки только в файле1, строки только в файле2 и линии, общие для обоих. Вы добавляете -1 , -2 , -3 чтобы удалить соответствующие столбцы из вывода. Поэтому comm -12 оставляет только третий столбец (общие строки).

tr -s '[:space:]' '[\n*]' tr ansliterate любое значение символов space классов в строки новой строки, чтобы каждое слово было на собственной строке.

sort -u сортирует и удаляет дубликаты из вывода tr .

Подстановка процесса <(...) выполняет вывод команд tr|sort в comm .


С zsh :

 w1=($(<a.txt)) w2=($(<b.txt)) print -rl -- ${(u)${w1:*w2}} 

Там слово представляет собой последовательность символов, отличную от пробела, tab, nul и newline (со значением по умолчанию $IFS ).

$(<a.txt) – это оптимизированная версия $(cat a.txt) где zsh читает содержимое файла сам по себе, не вызывая cat , поскольку он не цитируется, он претерпевает разбиение слов (но не глотает вопреки другим оболочкам ).

Таким образом, w1 и w2 являются массивами, содержащими все слова в a.txt и b.txt .

${w1:*w2} – zsh-оператор, который дает пересечение двух массивов (общих для обоих элементов). (u) – флаг расширения параметра, который сохраняет уникальные элементы (удаляет дубликаты).

print -rl печатает каждый аргумент по одной в строке.

 # Create dummy text file containing two words $ echo -e "overflow\ngrep" > b # Search in file for lines containing one word from file b $ grep --color --fixed-strings --file b /usr/share/dict/words 

Результат в моей системе:

 overflow overflow's overflowed overflowing overflows - overflow overflow's overflowed overflowing overflows 

Добавьте параметр -only-matching (-o), чтобы получить только слова, а не всю строку, в которой они появляются.

Предполагая, что слова в файлах разделены LF, а слова состоят только из «хороших» символов, и в b.txt отсутствует последний LF.

 egrep `tr '\n' '|' < b.txt` a.txt 

может сделать трюк.

Хотя вы не работаете над словом, вам больше нравится работать над линиями, и вам может быть полезно или кто-то другой ищет ответ.

 diff --left-column --from-file=a.txt --to-file=b.txt 

Сравнивает файл a.txt с файлом b.txt, выводящим только общие строки.

  • В чем причина этой ошибки: Ошибка: EACCES, отказ в доступе
  • Сравнить строки и обновить два разных файла
  • Как ACL вычисляет эффективные разрешения для файла?
  • Удаление повторяющихся записей из файла
  • Разделить содержимое файла в Linux
  • inotifywait различные действия по файлу или директории
  • защита файла на диске с помощью защиты паролем. Шифрованный ssl-шифр и просмотр файла более защищенным способом.
  • Добавление столбца на основе сопоставления второго столбца
  • Как указать дату и время в имени файла?
  • Ограничение размера файла
  • Симметричная разностная труба?
  • Восстановить права доступа к файлам после копирования Windows
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.