kuroの覚え書き

96の個人的覚え書き

リストに従ってテキスト置換

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でやるとエラーが出る。MacBSD 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なわけで。
いろいろ考えてみたが、リストを降順で記載しておけば、大きい数字のところから処理されていくため、期待通りの変換になることがわかった。