Использование grep для поиска файлов последовательности ДНК

Я пытаюсь использовать grep Unix для поиска определенных последовательностей в файлах. Файлы обычно очень большие (~ 1 ГБ) с буквами «A», «T», «C» и «G». Эти файлы также занимают много-много строк, каждая из которых представляет собой слово из 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 игнорировать разрывы строк в целевой строке? Есть ли простой способ сделать это?


person Jason G    schedule 19.09.2012    source источник
comment
Как узнать, где последовательности начинаются и заканчиваются? Например, последовательность может состоять только из 40 символов, а затем прерываться после последовательности из 40 символов. Если вы проигнорируете разрывы строк, grep просто вернет весь файл как одну найденную запись.   -  person Mark Meyer    schedule 19.09.2012
comment
+1 к комментарию выше; кроме того, результаты grep кажутся довольно бессмысленными, поскольку они представляют собой случайные части последовательности (если только весь файл не является одной последовательностью).   -  person Lev Levitsky    schedule 19.09.2012
comment
Если файл содержит одну строку, вы можете объединить строки, удалив \n, например, с помощью tr -d '\\n' < inputfile >tempfile   -  person wildplasser    schedule 19.09.2012
comment
тогда возникает вопрос: «Содержит ли этот файл целевую последовательность?» Или вам действительно нужно увидеть какой-то контекст для строки, в которую встроены данные? Если вы просто пытаетесь найти файлы с целевой последовательностью, используйте метод @wildplasser, чтобы сгладить файл. В противном случае инструменты unix (sed, awk, grep) являются линейно-ориентированными инструментами. Вы заставляете их прыгать через обручи, чтобы обработать ваши неуклюжие данные. Есть ли шанс исправить источник? Удачи.   -  person shellter    schedule 20.09.2012
comment
Я не хочу изменять файлы и не хочу создавать новый файл без разрывов строк. У меня уже есть сотни файлов, которые занимают терабайты дискового пространства, дублировать их не стоит, а их изменение сделает их непригодными для использования большинством программ. Я думаю, что shellter и NuclearGhost дали понять из своих описаний, что (grep, sed, awk) это/не инструменты, которые мне нужны для этой работы... При этом, кто-нибудь знает об управляемом терминале unix? инструмент интеллектуального анализа данных?   -  person Jason G    schedule 20.09.2012
comment
Кроме того, я новичок в stackoverflow.com. Как можно «проголосовать» за ответ?   -  person Jason G    schedule 20.09.2012
comment
Точнее, я хотел бы подсчитать количество раз, когда определенная последовательность встречается в файле, и я хотел бы, чтобы инструмент вел себя так, как если бы в файле не было разрывов строк (даже если они есть); как если бы последовательные строки были объединены, и весь файл находится в одной строке.   -  person Jason G    schedule 20.09.2012
comment
Что ж, не очень сложно (и бот тоже не тривиален) создать DFA, который сканирует файл, игнорируя разрывы строк. (f)lex может быть началом построения DFA. Однажды я разместил здесь скрипт, чтобы сгенерировать гибкий скрипт для этого (поиск несколько (не перекрывающихся) шаблонов за один проход)   -  person wildplasser    schedule 20.09.2012
comment
stackoverflow.com/a/8713849/905902 вот ссылка. IIRC, flex имеет возможность заменить getc() пользовательской функцией, которая в вашем случае может использоваться для пропуска встроенных новых строк (и увеличения счетчика строк)   -  person wildplasser    schedule 20.09.2012
comment
@KasonG: Чтобы проголосовать, вам нужно как минимум 15 репутации. См. часто задаваемые вопросы.   -  person AndrewC    schedule 20.09.2012
comment
Почти верно: чтобы проголосовать, вы должны быть зарегистрированы и авторизованы, а также иметь не менее 15 репутации.   -  person wildplasser    schedule 20.09.2012
comment
@potong Ты пропустил это? Если вы не можете сделать это в sed, никто не сможет. Джейсон Джи: P.S. Добро пожаловать в StackOverflow. Пожалуйста, не забудьте принять ответ, который лучше всего решает вашу проблему, если таковой имеется, нажав знак галочки, i.imgur .com/uqJeW.png . Когда вы видите хорошие вопросы и ответы, проголосуйте за них, используя серые треугольники, i.imgur.com/kygEP.png . Обратите внимание, что «предоставление» очков репутации другим не означает вычет ваших очков репутации (если только вы не разместили награду).   -  person shellter    schedule 20.09.2012


Ответы (1)


Я предполагаю, что каждая ваша строка имеет длину 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
person user1011046    schedule 20.09.2012