手動で生成されたgffファイルがあります。各行は繰り返され、各偶数行の2番目の列で文字列 "gene"を文字列 "cds"に置き換える必要があります。
私のファイルは次のとおりです。
NC_002929.2 Seq gene 3653563 3653611 . + . Pred285
NC_002929.2 Seq gene 3653563 3653611 . + . Pred285
NC_002929.2 Seq gene 2902987 2903162 . - . rgtA
NC_002929.2 Seq gene 2902987 2903162 . - . rgtA
私はそれが次のように見えるようにしたいです:
NC_002929.2 Seq gene 3653563 3653611 . + . Pred285
NC_002929.2 Seq cds 3653563 3653611 . + . Pred285
NC_002929.2 Seq gene 2902987 2903162 . - . rgtA
NC_002929.2 Seq cds 2902987 2903162 . - . rgtA
実際のファイルはこれよりはるかに大きいです。これはほんの一例です。誰でも私を助けることができますか?
答え1
GNU sedがあると仮定nスキップmアドレス演算子であり、文字列はgene
2番目の列の前にどこにも表示できません。
sed '2~2s/gene/cds/' file.gff
sedには「熱」という本質的な概念はありません。2~2
ここでは2つの列を意味します。ワイヤー2日から始まるワイヤーgene
、一致する行の最初の項目を置き換えます。
最後の「列」に置換を適用するには、行の末尾に固定の空白以外の文字を一致させるなどの操作を実行する必要があります。
sed -r '2~2{s/gene/cds/; s/[^[:blank:]]+$/ID=&/;}' file.gff
真の熱指向のものが必要な場合は、awk、perl、またはmillerを試してください。
答え2
また、次のawk
アプローチを試してください。
awk -F"[ ]" '!(NR%2) {sub (/gene/, "cdc ", $3); $NF = "ID=" $NF} 1' file
NC_002929.2 Seq gene 3653563 3653611 . + . Pred285
NC_002929.2 Seq cdc 3653563 3653611 . + . ID=Pred285
NC_002929.2 Seq gene 2902987 2903162 . - . rgtA
NC_002929.2 Seq cdc 2902987 2903162 . - . ID=rgtA