2012-06-03 43 views
4

我有一个看起来像这样的文件。使用grep进行匹配时,搜索字符串中的空格。

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 

命令分别与分别和11ba相匹配。我想匹配整个事物(用空格隔开),即10gs + VWW + A + 210 11ba匹配,而不是分开的两个字符串。

如何修改现有的shell脚本来克服搜索字符串中的空格字符?

此外,由于我匹配这些字符串集的文件很大,大约为50GB。 因此,内存高效的解决方案是值得欢迎的。 谢谢。

回答

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 

使用-f标志的grep

0123在相同的测试文件

real 0m2.190s 
user 0m2.163s 
sys  0m0.026s 

换句话说

grep -f pattern.txt bigfile.txt 

定时,的grep -f性能似乎是更好地与大图案文件10倍左右。

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 
相关问题