LoginSignup
0
0

More than 5 years have passed since last update.

FASTAQ => FASTA

Last updated at Posted at 2015-01-11

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0