Как извлечь сходство между двумя строками

У меня две строки в двух разных предложениях:

строка 1: 30 mutation alanine for valine

строка 2: alanine at position 30

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

4 Solutions collect form web for “Как извлечь сходство между двумя строками”

Может быть, wdiff может вам помочь? Поместите строки в два файла, а затем сравните их с wdiff :

 echo "30 mutation alanine for valine" > file1 echo "alanine at position 30" > file2 wdiff -t file1 file2 

Снимок экрана:

Снимок экрана

Единственное, что вы можете сделать, это проверить слова, которые появляются в обеих строках:

 $ comm -12 <(sed 's/ /\n/g' <<<$str1 | sort) <(sed 's/ /\n/g' <<<$str2 | sort ) 30 alanine 

объяснение

  • Команда comm command сравнивает файлы. С флагами -1 и -2 он будет печатать те строки, которые находятся в обоих файлах.

  • sed 's/ /\n/g' <<<$str1 | sort sed 's/ /\n/g' <<<$str1 | sort : Это просто заменяет все пробелы символами новой строки в $str1 , печатается на стандартный вывод, который затем передается через sort потому что comm нуждается в сортировке входных файлов. Подробнее о формате <<<$var см. В разделе Bash: Here Strings .

  • Формат <(command) называется заменой процесса, более того, здесь .

Конечным результатом команды выше будет список всех слов, которые появляются в обеих строках.

Я не могу придумать способ с простым регулярным выражением, поскольку то, что вы делаете, немного сложное.

На языке, подобном Ruby, вы можете разделить строки на массив слов с пробелом через регулярное выражение ( \s+ ) и получить пересечение ( & ) двух результирующих массивов.

 "30 mutation alanine for valine".split( /\s+/ ) & "alanine at position 30".split( /\s+/ ) => ["30", "alanine"] 

Пробел на самом деле является дефолтом по умолчанию в Ruby, поэтому его можно сократить до

 "30 mutation alanine for valine".split & "alanine at position 30".split 

Вот решение awk :

 $ awk '{for(i=1;i<=NF;i++){a[$i]++}} END { for(i in a) { if(a[i] > 1) { print i } } }' file1 file2 30 alanine 
  • Изменение существующего файла непосредственно для замены «foo» на «bar» ТОЛЬКО для строк, содержащих «baz»,
  • Regex, который будет grep-номера после определенной строки
  • Текст цензора с регулярным выражением
  • Как удалить строки, соответствующие foo, но не соответствующие строке?
  • Как вы можете объединить все строки, которые заканчиваются символом обратной косой черты?
  • Удаление повторяющихся слов между скобками inline
  • bash regex для поиска и сохранения строки из файла
  • Перемещайте каждую строку до конца строки, содержащей символ
  • Помогите с пониманием регулярного выражения
  • регулярное выражение шаблона для правила перезаписи apache
  • Извлечение определенных строк набора, соответствующих правилу
  • Как присоединиться к строкам vCards
  • Interesting Posts

    15 ГБ неиспользуемого пространства в файловой системе

    Есть ли буфер обмена в системах без GUI Ubuntu / Linux? Могу ли я синхронизировать его с моим локальным (OS X) буфером обмена?

    Что я должен преподавать в своем классе Linux?

    Как интерпретировать символ в строке, переданной через SSH

    записывать эффекты изображения в виде анимаций

    Разница между схемой grep ^ $ и ^

    Как проверить отсутствие поддержки установленных пакетов в Arch Linux?

    grep несколько строк, подсчет строк, эхо-выход для каждой строки

    Идиоматический метод bash для запуска необязательного действия без побочных эффектов на код выхода

    Установка старых версий PHP на Debian Jessie

    Удалите повторяющиеся строки из нескольких файлов в папке: проверьте только файлы в пределах диапазона

    Как я могу выбрать одну сеть Wi-Fi над другой?

    В чем преимущество использования pthreads в Linux?

    Linux Mint (Cinnamon, Muffin) установил сочетание клавиш, где один из клавиш – это мышь

    Использование бриз-темных приложений, отличных от KDE?

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