我有一个看起来像这样的文件。
10gs+VWW+A+210 10gs-ASN-A-206 0.616667 0.094872
10gs+VWW+A+210 10gs-GLU-A-31- 0.363077 0.151282
10gs+VWW+A+210 10gs-GLY-A-207 0.602564 0.060256
10gs+VWW+A+210 10gs-LEU-A-132 0.378151 0.288462
10gs+VWW+A+210 10gs-LEU-A-60- 0.376812 0.133333
10gs+VWW+A+210 11ba-GLU-A-2-z 0.333333 0.065385
10gs+VWW+A+210 11ba-SER-A-15- 0.400000 0.053846
10gs+VWW+A+210 11ba-GLU-A-2-z 0.333333 0.065385
10gs+VWW+A+210 11ba-SER-A-15- 0.400000 0.053846
17gs+VWW+A+210 11ba-SER-A-77- 0.415789 0.101282
15gs+VWW+A+210 11ba-VAL-A-47- 0.413793 0.215385
我想要弄清楚匹配模式的行[包括其中的空格]。让我们说模式是:'10gs + VWW + A + 210 11ba - '
当我将这样的模式作为grep的参数给出时,我正确地获得了匹配的行。但是,当我想从一个文件pattern.txt
中匹配多个这样的模式时会出现问题,该文件在每一行上都有所有这些模式的列表。
pattern.txt
看起来像这样:
10gs + VWW + A + 210 11ba -
10gs + VWW + A + 210 10gs -
当我使用这样的shell脚本时:
for i in `cat pattern.txt`; do grep -e "^$i" bigfile.txt ; done
该命令分别使用10gs+VWW+A+210
和11ba分别匹配。我希望匹配整个事物(用空格分隔),即10gs + VWW + A + 210 11ba匹配,而不是两个字符串。
如何修改现有的shell脚本以克服搜索字符串中的空格字符?
另外,由于我匹配这些字符串的文件很大,大约50GB。 因此,欢迎使用内存高效的解决方案。 感谢。
答案 0 :(得分:1)
用其他符号替换空格
假设模式
中永远不会出现#
for i in $( cat pattern.txt | tr ' ' '#' ) ; do
j=$(echo "$i" | tr '#' ' ' )
grep -e "^$j" bigfile.txt
done
我的测试文件上的时间
real 0m20.739s
user 0m11.773s
sys 0m8.345s
在grep中使用-f标志
grep -f pattern.txt bigfile.txt
同一测试文件的时间
real 0m2.190s
user 0m2.163s
sys 0m0.026s
换句话说,对于大型模式文件,grep -f
的性能似乎要好10倍左右。
答案 1 :(得分:0)
以下命令和相应的结果是否适合您?必须通过管道拆分模式才能使其中任何一个匹配。
命令:
egrep '10gs\+VWW\+A\+210 11ba-|10gs\+VWW\+A\+210 10gs-' bigfile.txt
结果:
10gs+VWW+A+210 10gs-ASN-A-206 0.616667 0.094872
10gs+VWW+A+210 10gs-GLU-A-31- 0.363077 0.151282
10gs+VWW+A+210 10gs-GLY-A-207 0.602564 0.060256
10gs+VWW+A+210 10gs-LEU-A-132 0.378151 0.288462
10gs+VWW+A+210 10gs-LEU-A-60- 0.376812 0.133333
10gs+VWW+A+210 11ba-GLU-A-2-z 0.333333 0.065385
10gs+VWW+A+210 11ba-SER-A-15- 0.400000 0.053846
10gs+VWW+A+210 11ba-GLU-A-2-z 0.333333 0.065385
10gs+VWW+A+210 11ba-SER-A-15- 0.400000 0.053846