2つの文字列間の類似性を抽出する方法

2つの文字列間の類似性を抽出する方法

2つの異なる文に2つの文字列があります。

文字列1:30 mutation alanine for valine

文字列2:alanine at position 30

たとえば、正規表現を使用して両方とも30とアラニンを持っているので、2つの間の類似点を見つける方法はありますか?

答え1

あなたができることの1つは、両方の文字列に単語が表示されることを確認することです。

$ 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:これは単にすべてのスペースをnewlinesに置き換えて$str1stdoutとして印刷し、入力ファイルをソートする必要があるsortときにstdoutを渡します。commフォーマットの詳細については、<<<$var次を参照してください。Bash:ここに文字列を入力してください

  • この<(command)形式をプロセス置換と呼びます。これについての詳細はここ

上記のコマンドの最終結果は、両方の文字列に表示されるすべての単語のリストになります。

答え2

たぶんwdiffそれはあなたに役立つことができますか?文字列を2つのファイルに入れて、次のように組み合わせますwdiff

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

出力スクリーンショット:

出力スクリーンショット

答え3

あなたがやっていることは少し複雑なので、一般的な正規表現を使って行う方法を考えることはできません。

同じ言語を使うルビーあなたはできます分ける正規表現()で文字列をスペースで区切られた単語の配列に変換します\s+交差点&()2つの結果配列のうち。

"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

答え4

解決策は次のとおりです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

関連情報