![패턴의 겹치는 인스턴스 나열](https://linux55.com/image/39534/%ED%8C%A8%ED%84%B4%EC%9D%98%20%EA%B2%B9%EC%B9%98%EB%8A%94%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%20%EB%82%98%EC%97%B4.png)
문자열과 그 앞의 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