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

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

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

  • Как создаются файлы Linux / dev?
  • Разрешения группы неэффективны, разрешение все еще запрещено
  • Как найти частоту появления строк, содержащихся в файле?
  • Как рекурсивно перемещать партии из 20 файлов в пронумерованные папки из папки из 1000 файлов
  • В чем причина этой ошибки: Ошибка: EACCES, отказ в доступе
  • Noip «Не удается найти файл конфигурации», но файл есть
  • Параметры сжатия без буферизации linux
  • Как отсортировать файл на основе раздела поля
  • 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

    Как удалить черный полупрозрачный оверлей поверх фона, когда я масштабирую свои окна в Linux Mint путем редактирования кодов?

    При установке пакета .deb или .rpm всегда добавляется репозиторий в вашу систему?

    Apache httpd, WebDAV и несколько настроек

    Почему удаление каталогов генерирует сообщения об ошибках с помощью find -exec?

    Затвердевающий дебиан?

    Попытка grep url из источника html в .txt-файле с помощью sed

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

    Как настроить, какая звуковая карта jack2 будет использовать

    Сделать работу hunspell с emacs и немецким языком

    stdin 'hop' над процессом?

    практическое использование файла / etc / networks

    Команда quit слабее, чем windowkill?

    Как я могу подсчитать количество ядер процессора?

    Как скрыть указатель мыши в диспетчере отображения gnome-shell и gdm?

    не удается удалить файл с возвратом каретки

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