【发布时间】:2012-09-12 02:42:18
【问题描述】:
我正在尝试使用 Unix 的 grep 来搜索文件中的特定序列。这些文件通常非常大 (~1Gb),有 'A's、'T's、'C's 和 'G's。这些文件也跨越了很多行,每行都是一个 60ish 字符的单词。我遇到的问题是,当我在这些文件中搜索特定序列时,grep 将返回单行上出现的模式的结果,但如果模式跨越一行(中间某处有换行符)则不会。例如:
使用
$ grep -i -n "GACGGCT" grep3.txt
搜索文件grep3.txt(我把目标'GACGGCT's放在双星中)
GGGCTTCGA**GACGGCT**GACGGCTGCCGTGGAGTCT
CCAGACCTGGCCCTCCCTGGCAGGAGGAGCCTG**GA
CGGCT**AGGTGAGAGCCAGCTCCAAGGCCTCTGGGC
CACCAGGCCAGCTCAGGCCACCCCTTCCCCAGTCA
CCCCCCAAGAGGTGCCCCAGACAGAGCAGGGGCCA
GGCGCCCTGAGGC**GACGGCT**CTCAGCCTCCGCCCC
返回
3:GGGCTTCGAGACGGCTGACGGCTGCCGTGGAGTCT
8:GGCGCCCTGAGGCGACGGCTCTCAGCCTCCGCCCC
所以,我的问题是 grep 没有找到跨越第 2 行末尾和第 3 行开头的 GACGGCT。
如何使用 grep 查找在字符串中的任何位置可能包含或不包含换行符的目标序列?或者我如何告诉grep 忽略目标字符串中的换行符?有没有简单的方法来做到这一点?
【问题讨论】:
-
你怎么知道序列在哪里开始和停止?例如,一个序列可以只有 40 个字符,然后在 40 个字符序列之后中断。如果你忽略换行符,那么 grep 只会将整个文件作为一个找到的条目返回。
-
如果文件包含单个字符串,您可以通过删除 \n 来合并行,例如使用
tr -d '\\n' < inputfile >tempfile -
我不想更改文件,也不想创建没有换行符的新文件。我已经有数百个文件占用了 TB 的磁盘空间,复制它们是不值得的,更改它们会使大多数程序无法使用它们。我认为 shellter 和 NuclearGhost 已经从他们的描述中清楚地表明(grep、sed、awk)是/不是我完成这项工作所需的工具......话虽如此,有人知道 unix 终端控制吗数据挖掘工具?
-
更准确地说,我想计算一个特定序列在文件中出现的次数,并且我希望该工具的行为就像文件中没有换行符一样(即使有是换行符);就好像连续的行被连接起来,整个文件在一行上。
-
stackoverflow.com/a/8713849/905902 这是链接。 IIRC,flex 能够用用户提供的函数替换 getc(),在您的情况下,该函数可用于跳过嵌入的换行符(并增加行计数器)
标签: unix grep line-breaks dna-sequence