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

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

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

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

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

  • захватить текст по шаблону с началом и конечным тегом в нескольких строках
  • Как присоединиться к строкам vCards
  • регулярное выражение шаблона для правила перезаписи apache
  • исключить строки из файла на основе определенных значений в определенных столбцах
  • Извлечение определенных строк набора, соответствующих правилу
  • Изменение существующего файла непосредственно для замены «foo» на «bar» ТОЛЬКО для строк, содержащих «baz»,
  • Удалить все до «/» на каждой строке
  • Классы символов: постройте собственные
  • 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 
    Interesting Posts

    Изменение размера xterm заставляет оболочку испортить

    разрешение прилагаемого широкоэкранного

    Grep для числа, исключая его часть с плавающей запятой

    Kickstart не устанавливает X на rhel 7.2

    Как включить автоматический перезапуск Plasma / KDE при замораживании?

    Как подсчитать количество вхождений числа, большего чем x, из каждого столбца?

    Какие команды вы можете использовать в начале команды sed?

    Запись на exfat не сохраняется между креплениями?

    Использование переменной внутри последовательности команд в bash для дополнения существующей строки – синтаксическая ошибка или ошибочный дизайн?

    Входные и входные маршруты маршрутизации iptables

    Невозможно установить композитор на FreeBSD 10

    Как отключить управление беспроводной связью на постоянной основе

    Что вызвало эту проблему с файловой системой ext3?

    В HP-UX, как я могу записывать сообщения системных событий Information Only Only в syslog.log?

    Как добавить строку, включающую одинарные кавычки в файл с sed

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