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

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

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

  • Кто может изменять разрешения файла / каталога?
  • Как хранить большую папку в одном файле без сжатия
  • Создание контрольной суммы архива 7zip, созданного из создаваемого файла tar
  • команда «chmod g + s»
  • запускать скрипт в нескольких папках параллельно
  • Как узнать, сколько строк содержит текстовый файл, не просматривая его?
  • копирование файлов из одного каталога в другой
  • Что имеет приоритет - разрешение владельца / пользователя и группы?
  • 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, выводящим только общие строки.

    Interesting Posts

    Почему bash используется в сценариях загрузки?

    X.org: два «экрана» на одном «устройстве»

    Могу ли я использовать wget для рекурсивного скачивания всех файлов, но не их фактического содержимого?

    опция no-window gnome-dictionary не работает

    Звук трубы через наушники и гнездо микрофона

    Как найти, на какой файл влияет ошибка fsck?

    Расширение имени файла Emacs

    не может установить fixparts на centos 6.8 liveDVD

    Ограничьте стандартных пользователей для запуска команды с определенным аргументом

    «Ловушка … INT TERM EXIT» действительно нужна?

    Один лайнер для удаления репо с добавлением zypper addrepo на OpenSuse?

    Вывод трубопровода в текстовый файл в цикле for

    Мультизагрузочный USB-накопитель с использованием относительных путей с помощью Syslinux (или другого загрузчика)

    Слияние двух файлов с разницей

    определить фактическое использование памяти несколькими процессами, которые разделяют большой сегмент памяти

    Linux и Unix - лучшая ОС в мире.