패턴의 겹치는 인스턴스 나열

패턴의 겹치는 인스턴스 나열

문자열과 그 앞의 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

내 생각엔 문제는정규식은 일치하는 문자를 사용합니다.. 정규식 엔진이 길이가 0인 어설션을 지원하는 경우 이 문제를 어느 정도 해결할 수 있습니다.

예를 들어, 단지 필요한 경우계산발생하는 경우 단일 문자와 그 뒤에 오는 구성으로 구성된 PCRE를 사용할 수 있습니다.시야gt예를 들어 GNU grep 및 해당 PCRE 모드에서 (21 - 1) 문자로 구성됩니다 .

$ 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

관련 정보