我在两个不同的句子中有两个字符串:
字符串 1:30 mutation alanine for valine
字符串2:alanine at position 30
有没有办法找到它们之间的相似之处,因为很明显它们都有 30 和丙氨酸,例如使用正则表达式?
答案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
:这只是将 中的所有空格替换为换行符$str1
,打印到标准输出,然后通过标准输出,sort
因为comm
需要对其输入文件进行排序。有关格式的更多信息<<<$var
,请参见Bash:这里是字符串。该
<(command)
格式称为进程替换,更多相关信息这里。
上面命令的最终结果将是两个字符串中出现的所有单词的列表。
答案2
也许wdiff
可以帮助你?将字符串放入两个文件中,然后将它们与wdiff
:
echo "30 mutation alanine for valine" > file1
echo "alanine at position 30" > file2
wdiff -t file1 file2
输出的屏幕截图:
答案3
我想不出使用普通正则表达式的方法,因为你所做的有点复杂。
用像这样的语言红宝石你可以分裂通过正则表达式 ( ) 将字符串转换为空格分隔的单词数组,\s+
并得到路口&
两个结果数组的( ) 。
"30 mutation alanine for valine".split( /\s+/ ) & "alanine at position 30".split( /\s+/ )
=> ["30", "alanine"]
空格实际上是 Ruby 中 split 的默认值,因此可以缩短为
"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