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

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

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

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

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

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

    Каковы различные способы отображения сообщения в оболочку bash после входа пользователя в систему?

    идентификация слов в файле 1 и сопоставление их со вторым файлом и их печать

    Shell: как читать байты двоичного файла и печатать как шестнадцатеричные?

    Почему `> my.log 2> & 1 &` заставляет работу поддерживать выход из системы?

    Когда обнаружена уязвимость, влияющая на ядро ​​Linux, что мне делать с Docker?

    Выход MOZREPL, отображающийся в окне терминала

    Создание настраиваемой среды разработки

    Настройте процесс использования конкретной сетевой платы

    Как разрешения работают с графическим интерфейсом

    Сортировка одного файла по строке на основе другого файла

    Являются ли основные, второстепенные номера уникальными

    В nixos, как правильно настроить tmux?

    FreeBSD 11 Скремблированная консоль

    Генерировать основные ошибки страницы

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

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