2012-09-19 5 views
1

Я пытаюсь использовать grep Unix для поиска определенных последовательностей в файлах. Обычно файлы очень большие (~ 1Gb) «A», «T», «C» и «G». Эти файлы также охватывают много, много строк, каждая строка которых является словом 60 символов. Проблема, с которой я сталкиваюсь, заключается в том, что при поиске определенной последовательности в этих файлах grep возвращает результаты для шаблона, которые встречаются в одной строке, но не в том случае, если шаблон охватывает строку (имеет разрыв строки где-то посередине). Например:Использование 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, а be ginning строки 3.

Как использовать grep для поиска целевых последовательностей, которые могут включать или не включать строку в любую точку строки? Или как я могу сообщить grep игнорировать строки в целевой строке? Есть ли простой способ сделать это?

+2

Как вы знаете, где начинаются последовательности и остановки? Например, последовательность может состоять только из 40 символов, а затем после 40-символьной последовательности. Если вы игнорируете разрывы строк, grep просто вернет весь файл как одну найденную запись. –

+0

+1 к комментарию выше; Кроме того, результаты «grep» кажутся довольно бессмысленными, поскольку они представляют случайные части последовательности (если весь файл не является единственной последовательностью). –

+1

Если файл содержит одну строку, вы могли бы объединить строки, удалив \ n, например, с помощью 'tr -d '\\ n' < 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