1

パールについて質問があります。このファイルの各行には、異なる数の As Ts Gs および Cs が含まれているファイルがあります。ファイルは次のようになります。

ATCGCTGASTGATGCTG
GCCTAGCCCTTAGC
GTTCCATGCCCATAGCCAAATAAA 

各行に行番号を追加したい次に、6 文字ごとに \n を挿入し、作成された新しい行のそれぞれに 3 文字ごとに空のスペースを入れます。

出力の例は次のとおりです。

Line NO 1                   
ATC GCT
GAS TGA
TGC TG

Line NO 2
GCC TAG
CCC TTA
GC 

私は以下のコードを思いつきました:

my $count = 0;
     my $line;
     my $row;
     my $split;
     open(F, "Data.txt") or die "Can't read file: $!";
     open (FH, " > UpDatedData.txt") or die "Can't write new file: $!";
     while (my $line = <F>) {
      $count ++ ;
      $row = join ("\n",  ( $line =~ /.{1,6}/gs));
      $split = join ("\t",  ( $row =~ /.{3}/gs ));
      print FH "Line NO\t$count\n$split\n";
    }
    close F;
    close FH;

でも

次の出力が得られます

Line NO 1                   
ATC GCT
GA  STG A
T   GCT G

Line NO 2
GCC TAG
CC  CTT A
G   C 

これには、このコード行で \n が文字としてカウントされる何かが必要です

$split = join ("\t",  ( $row =~ /.{3}/gs ));

この問題を回避する方法を知っている人はいますか?

どんな助けでも大歓迎です。

前もって感謝します

シネード

4

3 に答える 3

1

これで問題が解決するはずです。

use strict;
use warnings;

while (<DATA>) {
  s/(.{3})(.{0,3})?/$1 $2 /g;
  s/(.{7}) /$1\n/g;

  printf "Line NO %d\n%s\n", $., $_;
}

__DATA__
ATCGCTGASTGATGCTG
GCCTAGCCCTTAGC
GTTCCATGCCCATAGCCAAATAAA
于 2012-12-05T16:35:40.760 に答える
0

これはワンライナーです:

perl -plwe 's/(.{3})(.{0,3})/$1 $2\n/g' data.txt

正規表現は 3 文字 (改行と一致しない) を探し、その後に 0 ~ 3 文字が続き、それらの両方をキャプチャしてから、それらの間にスペースを挿入し、その後に改行を挿入します。

行番号を追跡するには、追加できます

s/^/Line NO $.\n/;

入力行番号に基づいて列挙されます。必要に応じて、 などの単純なカウンターを保持できます++$i

  • -lオプションは改行を処理します。

次のように、2 段階で行うこともできます。

perl -plwe's/.{6}\K/\n/g; s/^.{3}\K/ /gm;'

\Kここで(keep) エスケープ シーケンスを使用して文字列の一致した部分を保持し、6 文字の後に改行を挿入し、「行頭」の後に 3 文字のスペースを挿入します。これには/m修飾子を使用すると改行も含まれます。

つまり、要するに:

perl -plwe 's/.{6}\K/\n/g; s/^.{3}\K/ /gm; s/^/Line NO $.\n/;' data.txt
perl -plwe 's/(.{3})(.{0,3})/$1 $2\n/g;    s/^/Line NO $.\n/;' data.txt
于 2012-12-05T15:54:25.533 に答える
0

別の解決策。レキシカルファイルハンドルの 3 つの引数形式を 使用することに注意してくださいopen

#!/usr/bin/perl
use warnings;
use strict;

open my $IN,  '<', 'Data.txt'        or die "Can't read file: $!";
open my $OUT, '>', 'UpDatedData.txt' or die "Can't write new file: $!";
my $count = 0;
while (my $line = <$IN>) {
    chomp $line;
    $line =~ s/(...)(...)/$1 $2\n/g;         # Create pairs of triples
    $line =~ s/(\S\S\S)(\S{1,2})$/$1 $2\n/;  # A triple plus something at the end.
    $line .= "\n" if $line !~ /\n$/;         # A triple or less at the end.
    $count++;
    print $OUT "Line NO\t$count\n$line\n";
}
close $OUT;
于 2012-12-05T16:16:03.673 に答える