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に置き換えて$str1
stdoutとして印刷し、入力ファイルをソートする必要がある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