아래와 같이 여러 줄로 구성된 파일이 있습니다. 각 종의 제목은 ">"로 시작합니다.
>gi|398852808|ref|NZ_AKJD01000108.1| Pseudomonas sp. GM80 PMI37_contig126.126, whole genome shotgun sequence
CCGCAGGCTGCGATCTTTTGATGTTGTTTTTTTAAGATCAAGATCAAAAGATCGCAGCCTTCGGCAGCTCCTACAGGTGG
TCGTGGGTTTAAGCCGCTCAATCCAGTAAACTGCGGCACGTTTTTCTCTAAGTAGTGTTTTCCCCATGCAAATTGCTCTG
GCGCCCATGGAGGGGTTGGTCGACGACATCCTCCGCGACGTGCTGACCCGCGTTGGCGGCATCGATTGGTGCGTGACTGA
ATTCATTCGGGTCAACGATCAGTTGCTCACCCCGGCTTACTTCCACAAGTTCGGCCCCGAGCTGCTCAACGGTGCCCGCA
CGGCGTCCGGCGTGCCATTGCGTGTGCAATTGCTCGGTTCCGACCCGGTGTGCCTGGCGGAAAACGCTGCACTGGCCTGC
제목 찾아서 바꾸고 싶어요
>NZ_AKJD01000108.1|kraken:taxid|398852808 Pseudomonas sp. A3(2016), complete genome
CGCGATGGTCGTTAACGAAAACGCATGCTTACTGGCTAAACGCGGCGCTCTTGACTCCAT
CGCGAGCAAGCTCGCTCCTACAGAAGAAAGCGGCGCTCTAGTGCGCCTCATCCCAGTTAT
TGCCTACCCCCACCTCGACCAGCAGCGGCACATCCAGTTGCGCGGCCCCGCTCATGTGCA
파일의 구조를 변경하지 않습니다.
나는 이것을 시도했다
awk -v repl=">kraken:taxid|$ID|" '{ gsub(/^>/,repl,$0); print $0}' $FILE
텍스트를 이동할 수는 있지만 삭제하거나 원하는 결과를 얻을 수는 없습니다. 더 빠른 방법이 있습니까? 파일 크기는 230GB입니다.
답변1
한 가지 방법은 문자를 필드 구분 기호로 사용하는 것입니다 |
.
awk -v repl="kraken:taxid" 'BEGIN{FS="|";OFS=FS} /^>/ {$1=">"$4;$3=$2$5;$2=repl;NF-=2}1'
데이터로 테스트하세요 file
.
$ awk -v repl="kraken:taxid" 'BEGIN{FS="|";OFS=FS} /^>/ {$1=">"$4;$3=$2$5;$2=repl;NF-=2}1' file
>NZ_AKJD01000108.1|kraken:taxid|398852808 Pseudomonas sp. GM80 PMI37_contig126.126, whole genome shotgun sequence
CCGCAGGCTGCGATCTTTTGATGTTGTTTTTTTAAGATCAAGATCAAAAGATCGCAGCCTTCGGCAGCTCCTACAGGTGG
TCGTGGGTTTAAGCCGCTCAATCCAGTAAACTGCGGCACGTTTTTCTCTAAGTAGTGTTTTCCCCATGCAAATTGCTCTG
GCGCCCATGGAGGGGTTGGTCGACGACATCCTCCGCGACGTGCTGACCCGCGTTGGCGGCATCGATTGGTGCGTGACTGA
ATTCATTCGGGTCAACGATCAGTTGCTCACCCCGGCTTACTTCCACAAGTTCGGCCCCGAGCTGCTCAACGGTGCCCGCA
CGGCGTCCGGCGTGCCATTGCGTGTGCAATTGCTCGGTTCCGACCCGGTGTGCCTGGCGGAAAACGCTGCACTGGCCTGC
특히 대용량 파일의 경우 Perl이 더 빠르다는 것을 알 수 있습니다.
perl -F'\|' -ane 'print /^>/ ? join "|", ">".$F[3], "kraken:taxid", $F[1].$F[4] : $_' file
그러나 좀 더 관용적인 방법이 있을 수 있습니다.