我试图捕获一个字符串及其前面的 21 个字符,然后将其输出到一个新文件。这是我目前正在使用的:
grep -o ".\{21\}gt" ../data/fastadata.txt > primerdata.txt
我得到了一些我想要的输出,但当gt
前面的 21 个字符中有任意数量是先前捕获字符串的一部分时,它会跳过 的实例。例如:
aaaatccataaatcgaggattacaagtggaaaacaaggaggcagt
将捕获
tccataaatcgaggattacaagt
但不是
caagtggaaaacaaggaggcagt
我相信是的,因为两个字符串将分别共享caagt
字符串 1 和 2 的结尾和开头。它最终丢失了至少一半的实例。
我该如何纠正这个问题?
它捕获了 121 个实例,但是在下面的文本文件中,...gt
前面有 21 个字符的实例大约有 200 个。gt
以下是我正在搜索的文件中的一些文本,其中包含我正在讨论的内容的实例(用于格式化的硬包装):
aaaccggcctcaagggaacgggtatgtctgcctcacctgtcggagatctacccaatcccagtctgcatct
aacggacactctaatgcaactgctggactgctgcttcctcaccctaacctgcagtggccaaatcgttttg
gtatccaccagcgtggagcagctattgggtcactgtcagtccgatttgtatggccagaatctactgcaga
tcacgcatcccgatgatcaggatctgttaagacagcagctaatacccagggatatagagaccctgttcta
tcagcatcagcaccaccagcagcaggggcacaatccccagcagcactccacttccacgtcggcctcaact
tcgggcagtgatctggaggaggaggaaatggagacggaggaacaccgtctgggtcggcagcagggagagg
cggacgatgacgaggatcacccgtacaaccgacgaacacccagcccgcggagaatggcccatttggcgac
cattgatgaccgactacgcatggatcggcgctgctttaccgtccgcttggctagggcttccacgcgagcg
gaggccacgcgtcattacgagcgggttaagatcgatggctgctttcgtcgcagtgactcctccttaaccg
gaggtgccgctgccaactatccgattgtctcccagctgatacgacgctcgagaaacaacaatatgctggc
tgctgctgcagcagtggcagcagaagcggcgacggtgccgccccagcacgatgccattgcccaggcggcg
ctgcacgggattagcggcaatgatattgtcctggtggccatggccagggtgctgcgagaggaacggccgc
ctgaggagacggagggtacagtgggcttgaccatttacagacagccagaaccctatcagttggagtacca
tacgaggcatctaatcgacggcagcatcatcgactgtgatcaaaggattggtctggtggcgggatatatg
aaggatgaggtgggtatattaacatcatctctctgaactgcttacgacaactaatcgtgtactctccact
cgaaacaggtgcgcaaccttagtcccttctgtttcatgcacctggacgacgttcgctgggtgattgtggc
ccttcgacaaatgtacgattgcaacagtgactacggcgagagctgctaccgtctgctgtcccgcaacggg
cgcttcatttacctgcacaccaagggatttctggaggtcgaccgtggcagtaataaggtgcattcctttc
tgtgcgtcaacacgctgctcgatgaggaggcgggccggcaaaaggtgcaggagatgaaggagaaattctc
gacaatcatcaaggcggagatgcccacgcagagcagcagtcccgatttgcccgcctcgcaggcaccgcag
caacttgagagaattgtcctctatctaatagagaacctacagaagagtgtggattcagcagagacggttg
gcggccagggcatggaaagcctaatggacgatggctacagttcgccagcaaataccttaactctcgagga
gttagctccctcgcccacgcccgccttggccttggtgccgccggctccctcatcggtcaagagctccatc
tccaagtcggtgagtgtggtcaatgtgacggcggccagaaagtttcagcaggagcatcagaagcagcgtg
aacgtgaccgtgagcagcttaaggagcgcaccaactccacgcagggcgtgatccggcaactgagcagctg
cctaagcgaggcggaaacggcatcctgtatcctatcaccagccagtagcttgagtgccagcgaagcaccg
gacacgcccgatccgcacagcaacacatcaccgccaccgtcgctccacacacgtcccagtgtcctgcatc
gaaccctgaccagcacgctgcgatgacgggctgatggaacctggtttgccttctaattgggtgtgtggaa
atggacgtcattggtagctcacgtgcccacaaacgaattagtatcggtaatataatcctggccaatcgca
aaatgaaaacccaaaatgtatcagaaaaaaacgagcattattcaaatagtttaaaaattcagccaaaaaa
cttaaaaacgaaaaaaaagagcgtgggttgaaaaaccttttgttttcatattcacatttccaagctttga
gcaatcaaacaattttaattttcagtatacacatatgtataatgagttggctttacaaaagctattaaca
aatcaagcaattgtgt
答案1
我认为问题是正则表达式消耗它匹配的字符。如果您的正则表达式引擎支持零长度断言,您也许可以在某种程度上解决这个问题。
例如,如果您只需要数数出现的情况下,您可以使用由单个字符后跟一个字符组成的 PCRE展望由 (21 - 1) 个字符组成,后跟gt
,例如在 GNU grep 及其 PCRE 模式中,
$ printf 'aaaatccataaatcgaggattacaagtggaaaacaaggaggcagt' |
grep -Po '.(?=.{20}gt)'
t
c
它输出每个匹配子字符串的初始字符,允许除单个字符之外的所有字符重叠。 (您可以通过管道将结果传递wc -l
给实际计数)。
如果您需要恢复实际的匹配字符串,这显然更困难,因为您需要消耗和不消耗字符 - 可能有一种方法可以通过返回匹配来做到这一点指数然后进行子字符串匹配,例如在 perl 中(可能很糟糕)
$ printf 'aaaatccataaatcgaggattacaagtggaaaacaaggaggcagt' |
perl -lne 'while ($_ =~ m/.(?=.{20}gt)/g) {print substr($_,@+[0]-1,23)}'
tccataaatcgaggattacaagt
caagtggaaaacaaggaggcagt