perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4
FASTQ と FASTA について
201501 現在
FASTQ に関しては、リードの配列と qual はそれぞれ一行に表示されています。従って複数行になっている場合は考慮しません。
逆に FASTA に関しては複数行の可能性があるものに関しては、その旨明記の上、コードを書きます。
FASTQ => FASTA
fasta のみ出力したいなら話は簡単です。
fastq.fq => seq.fa にします。
なんか、こんなの(リンク先の FASTQ_to_FASTA.pl )もあるみたいですが、、、
ワンライナー
$ perl -lne 'next if ( $. - 1 ) % 4 >= 2 ; s/^\@/>/ if $. % 4 == 1 ; print' fastq.fq > seq.fa
$.
で、読んでる行番号が把握出来ます。
従って、( $. - 1 ) % 4
によって場合分けをして、2 以上であれば、qual なので無視します。
で、ヘッダ行の @ を > に置換して出力するだけです。
60 塩基毎に改行
FASTQ を FASTA にした場合に、本来の FASTA 書式(即ち一定塩基長で改行を入れる事)に従う人はあまりいないでしょうし、する必要も無いと思います。
しかし、一定塩基毎に改行を入れる例として、、、
$ perl -lne 'next if ( $. - 1 ) % 4 >= 2 ; s/^\@/>/ if $. % 4 == 1 ; s/(.{1,60})/$1\n/g if $. % 4 == 2 ; print' fastq.fq > seq.fa
以下が新たに加わりました。
s/(.{1,60})/$1\n/g if $. % 4 == 2
FASTAQ => FASTA, QUAL
ツールを使いたい方はこちらへ
fastq.fq => seq.fa, seq.qual に分割します。
ワンライナー
$ perl -Mvars='$f,$n' -lne 'open $f, q{>>}, ( $. - 1 ) % 4 < 2 ? q{seq.fa} : q{seq.qual} ; $n = ( /\@(.*?)$/ )[0] if $. % 4 == 1 ; print {$f} $. % 2 == 1 ? ">$n" : $_ ' fastq.fq
- 追加書き。複数回実行する場合は、前のデータをリネームしてから実行。
- ファイルハンドルの切り替えと、ヘッダ出力の判断に三項演算子をつかっています。
別解
$ perl -Mvars='@f,$n' -lne 'BEGIN{ open $f[$_], q{>}, $_ ? q{seq.qual} : q{seq.fa} for 0 .. 1 } $n = ( /\@(.*?)$/ )[0] if $. % 4 == 1 ; print { $f[ int ( ($. - 1) % 4 / 2 ) ] } $. % 2 == 1 ? ">$n" : $_ ' fastq.fq
- 追加書きじゃないコードを書くと途端に煩雑になる。
-
BEGIN{}
でファイルハンドルを二つ開いて - ファイルハンドルの切り替えを
int ( ($. - 1) % 4 / 2 )
に託す
実の所、配列のインデクスは、自動的に int
されてるっぽいんですよね。
$f[ ($. - 1) % 4 / 2 ]
でもきちんと動くって言う、、、
$ perl -le '$a = [ 10, 20] ; print @{$a}[0.99,1.55]'
1020