2012-09-19 53 views
1

我想用Unix的grep來搜索文件中的特定序列。這些文件通常非常大(〜1Gb)'A','T','C'和'G'。這些文件也包含許多行,每行都是一個60字的字。我遇到的問題是,當我在這些文件中搜索特定的序列時,grep將返回單行上發生的模式的結果,但是如果模式跨越一行(在中間的某處存在換行符),則不會。例如:使用grep來搜索DNA序列文件

使用

$ 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找不到跨越第2行末尾的GACGGCT,軋花的第3行。

我該如何使用grep來查找可能包含或可能不包含換行符的任何位置的目標序列?或者我怎麼能告訴grep忽略目標字符串中的換行符?有沒有簡單的方法來做到這一點?

+2

你怎麼知道那裏的序列啓動和停止?例如,一個序列只能有40個字符,然後在40個字符序列後中斷。如果你忽略換行符,那麼grep將只返回整個文件作爲一個單一的發現條目。 –

+0

+1以上評論;同樣,grep結果看起來毫無意義,因爲它們表示序列的隨機部分(除非整個文件是單個序列)。 –

+1

如果文件包含單個字符串,則可以通過刪除\ n來組合這些行,例如用'tr -d'\\''< inputfile > tempfile' – wildplasser

回答

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 
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