4

我有一个看起来像这样的文件。

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。因此,欢迎使用内存高效的解决方案。谢谢。

4

2 回答 2

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 倍左右。

于 2012-06-03T15:22:32.190 回答
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
于 2012-06-03T15:23:36.140 回答