perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4
大文字に、小文字に。
$ perl -lpe '$_ = uc if !/>/ ' seq.fa
このコードは塩基配列に改行が入っていても使える <= 当たり前。
小文字にするなら uc
を lc
にするだけ。
多少分ってる人なら「なんで -l
を残す!」と突っ込みが入りそうですが、、、
reverse&complement #1
改行込みの塩基配列では使えません。
$ perl -lpe '( $_ = reverse ) =~ tr/ACGT/TGCA/ if !/>/ ' seq.fa
これを -l
抜きでやってみれば分ります。
面倒なので、よほどの必要が無い限り -l
付きです。
-
reverse
は、このケースでは$_
を逆順に出力。注意点は後述。 -
tr/ACGT/TGCA/
は塩基配列中の A => T, T => A, C => G, G => C の置換を同時に行なう。
reverse&complement #2
改行込みの塩基配列ならば。
$ perl -F'(?=>)' -0777 -ane 'for ( @F ){ my @s = split /\n/ ; ( my $s = reverse @s[1..$#s] ) =~ tr/ACGT/TGCA/ ; $s =~ s/(.{1,60})/$1\n/g ; print join "\n", $s[0], $s }' seq.fa
- 定型文を分割するなら、丸呑みは常套手段
- しかし分割の
-F'REGEX'
には工夫が必要となる- 先読み、後読み言明に関してはここ
-
s/(.{1,60})/$1\n/g
によって 60base 区切りで改行を入れる - 難読になる
- メモリ食い(まあ、今時、、、)
reverse は鬼門
perl の関数はリストコンテキストとスカラコンテキストで挙動が変わるものが多々あるが、 bioinformatics な人にとって最初のトラップが reverse じゃないかと思う
$ perl -le 'print reverse q{aababc}'
aababc
リストコンテキストだと、「要素の逆順」を実行
$ perl -le 'print scalar reverse q{aababc}'
cbabaa
なのでスカラコンテキストに強制的にしないといけない
$ perl -le 'print + reverse q{aababc}'
aababc
単項演算子の +
が単項演算子の scalar
とほぼ同等のものと思って使うと、更にドツボに嵌る
reverse LIST
リストコンテキストでは、LIST を構成するよ要素を逆順に並べた リスト値を返します。 スカラコンテキストでは、LIST の要素を連結して、 全ての文字を逆順にした文字列を返します。
引用元
そもそも最初っから VARIABLE を相手にしていない。のに、、、
スカラコンテキストで引数なしで使うと、reverse() は $_ を逆順にします。
んな挙動付けるから、 VARIABLE 相手がメインな関数だと思い込んじゃう。
multi fasta => single fasta #1
ヘッダをファイル名として、展開するワンライナー
ファスタヘッダに '/' などの記号が含まれていないものとする。
$ perl -Mvars='$f' -lne 'open $f, q{>}, $1 . q{.fa} if /^>(.*?)$/ ; print {$f} $_' seq.fa
このコードは塩基配列に改行が入っていても使える。
- 定型文を分割する場合は、パターンでオープンするファイルハンドルを切り替えるだけなので楽。
- blast やらなんやら、、、
-
close $f
しないのは、明かにお行儀が悪いけど、一行野郎なので目を瞑る。
multi fasta => single fasta #2
ついでに、もいっこ。
$ perl -F'(?=>)' -0777 -ane 'for( @F ){ open my $f, q{>}, $1 . q{.fa} if /^>(.*?)\n/s; print {$f} q{>} . $_ }' seq.fa
次回へ