LoginSignup
0
0

More than 5 years have passed since last update.

FASTQ

Last updated at Posted at 2015-01-17

perl のワンライナーに関しての、適当な解説 #1/#2/#3/#4

trim end

はっきり言ってコレを使う人はいないと思うが、シンプルなトリムの例として。

コンセプト

  • phred quality 15 以下が五連続したら、カットする。

ワンライナー

$ perl -MO=Deparse -Mvars='@d' -F'' -lane 'push @d, $_ ; next if $. % 4 != 0 ; my $o;  L:for my $i ( 0 .. $#F ){ next L if ! defined $F[$i + 4] ;  for ( 0 .. 4){ next L if $F[$i + $_] gt q{0} } $o = $i ; last L } ; $o and $d[$_] = substr $d[$_], 0, $o for 1, 3; print join "\n", @d  ; @d = () ' fastq.fq 

解説

B::Deparse の結果で解説

BEGIN { $/ = "\n"; $\ = "\n"; }
use vars (split(/,/, '@d', 0));
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    our @F = split(//, $_, 0);                     #3
    push @main::d, $_;                             #1
    next if $. % 4 != 0;                           #2
    my $o;
    L: foreach my $i (0 .. $#F) {
        next L unless defined $F[$i + 4];
        foreach $_ (0 .. 4) {                      #4
            next L if $F[$i + $_] gt '0';
        }
        $o = $i;
        last L;
    }
    $o and $main::d[$_] = substr($main::d[$_], 0, $o) foreach (1, 3);    #5
    print join("\n", @main::d);
    @main::d = ();                                 #6
}
-e syntax OK

while 文を回して、リード毎に @d にストック(#1)。
処理はリード毎なので、 quality 行以外は次の行に(#2)。
quality をチェックするので @F へ split(#3)。
quality が五連続で 15 以下になる最初の位置を $o にセット(#4)。
トリムの実行(#5)。
リード情報のクリア(#6)。

  • phred score 15 は、ascii コード 48 番。即ち文字列 '0'
  • 文字列の大小比較をしてしまえば良い。態々 phred score に変換するのはナンセンス。
  • ラベルは活用した方が良いんじゃね? goto は論外だけど
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