FASTAファイルのIDの命名を変更したいと思ったが、scaffoldの数が多すぎて面倒臭すぎるので、自動化したい。
変更一覧をrename.listに以下のように記録しておく。
Scaffold1 Scf0001 Scaffold2 Scf0002 Scaffold3 Scf0003 Scaffold4 Scf0004 .......... ...........
で、おもむろに
$sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' rename.list | xargs -I{} sed -i '{}' target.fasta
とワンライナーを走らせる。
なお、Macでやるとエラーが出る。Mac版BSD sedでは-iオプションにバックアップファイルの設定が必須だから、ということらしいがそれだけでもなさそうな。
sed: 1: "target.fasta": undefined label 'arget.fasta'
というエラーが延々出る。なにこれ?
$ brew install gsed
でGnu sedをインストールしてしまえばこの問題は起こらないことがわかった。
$sed 's/\([^\t]*\)\t\(.*\)/s|\1|\2|g/' rename.list | xargs -I{} sed -i "" '{}' target.fasta
参考ページはこちら
参照ファイルを用いて、複数のテキスト置換を一括で行う - Qiita
で、実際に走らせてみると不具合発覚。
例えばScaffold11とかがScf00011になる。本来の希望はScf0011なわけで。
いろいろ考えてみたが、リストを降順で記載しておけば、大きい数字のところから処理されていくため、期待通りの変換になることがわかった。