1

我正在尝试使用 Unix 的 grep 来搜索文件中的特定序列。这些文件通常非常大(~1Gb),有 'A's、'T's、'C's 和 'G's。这些文件也跨越很多行,每行是一个 60 多个字符的单词。我遇到的问题是,当我在这些文件中搜索特定序列时,grep 将返回单行上出现的模式的结果,但如果模式跨越一行(中间某处有换行符)则不会。例如:

使用

$ grep -i -n "GACGGCT" grep3.txt 

搜索文件 grep3.txt(我将目标“GACGGCT”放在双星中)

GGGCTTCGA**GACGGCT**GACGGCTGCCGTGGAGTCT
CCAGACCTGGCCCTCCCTGGCAGGAGGAGCCTG**GA
CGGCT**AGGTGAGAGCCAGCTCCAAGGCCTCTGGGC
CACCAGGCCAGCTCAGGCCACCCCTTCCCCAGTCA
CCCCCCAAGAGGTGCCCCAGACAGAGCAGGGGCCA
GGCGCCCTGAGGC**GACGGCT**CTCAGCCTCCGCCCC

退货

3:GGGCTTCGAGACGGCTGACGGCTGCCGTGGAGTCT
8:GGCGCCCTGAGGCGACGGCTCTCAGCCTCCGCCCC

所以,我的问题是grep没有找到GACGGCT跨越第 2 行末尾和第 3 行开头的。

如何使用 grep 查找在字符串中的任何位置可能包含或不包含换行符的目标序列?或者我怎么能告诉grep忽略目标字符串中的换行符?有没有一种简单的方法可以做到这一点?

4

2 回答 2

0

我假设你的每一行都是 60 字符长。然后下面的 cmd 应该可以工作

tr '\n' ' ' < grep3.txt | sed -e 's/ //g' -e 's/.\{60\}/&^/g' | tr '^' '\n' | grep -i -n "GACGGCT"

输出 :

1:GGGCTTCGA**GACGGCT**GACGGCTGCCGTGGAGTCTCCAGACCTGGCCCTCCCTGGC
2:AGGAGGAGCCTG**GACGGCT**AGGTGAGAGCCAGCTCCAAGGCCTCTGGGCCACCAGG
4:CCAGGCGCCCTGAGGC**GACGGCT**CTCAGCCTCCGCCCC
于 2012-09-20T06:31:24.693 回答
0
pcregrep -nM "G[\n]?A[\n]?C[\n]?G[\n]?G[\n]?C[\n]?T" grep3.txt
1:GGGCTTCGAGACGGCTGACGGCTGCCGTGGAGTCT
2:CCAGACCTGGCCCTCCCTGGCAGGAGGAGCCTGGA
CGGCTAGGTGAGAGCCAGCTCCAAGGCCTCTGGGC
6:GGCGCCCTGAGGCGACGGCTCTCAGCCTCCGCCCC
于 2013-08-02T13:15:28.243 回答