以下のように複数行のファイルがあります。各種のタイトルは「>」で始まります。
>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
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
しかし、より慣用的な方法があるかもしれません。