単語位置の変更

単語位置の変更

以下のように複数行のファイルがあります。各種のタイトルは「>」で始まります。

>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

しかし、より慣用的な方法があるかもしれません。

おすすめ記事