電子書籍の厳選無料作品が豊富!

ーーーーーーーーーーーー
SRR_1 X1 Y1
SRR_1 X2 Y2

SRR_1 Xn Yn
SRR_2 X1 Y1
SRR_2 X2 Y2

SRR_3 X1 Y1

SRR_xxx X1 Y1
ーーーーーーーーーーー

このようなタブ区切りのファイルを、一列目のSRR以降の数字が変わるごとに以下のようにファイルを分割したいと思っています。

SRR_1.txt
ーーーーーーー
X1 Y1
X2 Y2

Xn Yn
ーーーーーーー

SRR_2.txt
ーーーーーーー
X1 Y1

Xn Yn
ーーーーーーー

perl初心者ですが、どうかよろしくお願いします。

A 回答 (4件)

基本的にはキーブレイク処理の応用で対応できます。


キーブレイクした最初のデータごとに出力ファイルをオープンしていき、
オープンした出力ファイルに出力する方法をとります。

具体的には以下のような手順になります。

1.タブ区切りファイルの最初の項目について昇順に並べ替えておきます。
  (元々昇順に並んでいる場合は、この処理は不要です)

  ※以下、サンプルスクリプトをあげます。
   "input.txt"が元々の「タブ区切りファイル」
   "output.txt"が「タブ区切りファイル」の最初の項目である"SRR_1"や"SRR_2"などを
   昇順に並べ替えた結果になります。 

open(IN1,"input.txt");
open(OUT1,">output.txt");

@record  = ();
$in1_ctr = 0;
while (<IN1>) {
  chomp($_);
  $record[$in1_ctr] = $_;
  $in1_ctr++;
}

@sort_rec = sort { 
      my @a = split("\t", $a);
      my @b = split("\t", $b);
      $a[0] cmp $b[0];
   } @record;

foreach $record (@sort_rec) {
 print OUT1 "$record\n";
}

close(IN1);
close(OUT1);

2.キーブレイクした最初のデータごとに出力ファイルをオープンしていき、
  オープンした出力ファイルに出力します。

  ※以下、サンプルスクリプトをあげます。
   "input.txt"が昇順に並べ替えた「タブ区切りファイル」
   出力結果は同じフォルダにできているはずです。
   出力したい項目は最初のタブ区切りファイルの2項目目と3項目目だけ、
  また、"SRR_1"などの区分は1,000項目未満という前提で作成していますので、
  必要に応じて変更してください。

open(IN1,"input.txt");

$in1_key = undef;  #入力キー
$in1_ctr = undef;  #入力キーごとの件数
@in1   = undef;  #入力データの配列
$sv_key  = undef;  #保存した入力キー

while (<IN1>) {
  chomp($_);
  @in1 = split("\t",$_,-1);
  $in1_key = $in1[0];

 if ($sv_key ne $in1_key) { 
   $w_out = OUT.sprintf("%03d",$in1_ctr);
   $w_file = ">".$in1_key.".txt";
   open($w_out,"$w_file"); 
 }
 $out1 = join("\t",$in1[1],$in1[2]);
 print $w_out "$out1\n";
 $sv_key = $in1_key;
}
close(IN1);

※上記は、スクリプトを見やすくするために全角スペースを含んでいます。
 このまま、コピー・ペーストしても実行できませんので、ご注意ください。
    • good
    • 0
この回答へのお礼

ソースを書いていただきありがとうございます。
"SRR_"以下の数字は4桁までありましたが、一部修正することによって問題なく処理できました。
ありがとうございます。

お礼日時:2011/11/19 00:34

だいぶ手抜き。


use strict;
use warnings;
use v5.12;
use autodie;

my @input = <DATA>;
my $output = +{};

foreach (@input) {
chomp;
my @e = split "\t";
my $t = shift @e;
push @{$output->{$t}}, [@e];
}

foreach (sort keys %{$output}) {
my $filename = $_;
open my $out, '>', $filename . ".txt";
say $out join("\t", @$_) foreach @{$output->{$filename}};
close $out;
}

__END__
SRR_1X1Y1
SRR_1X2Y2
SRR_1X3Y3
SRR_2X1Y1
SRR_2X2Y2
SRR_3X1Y1
SRR_4X2Y2
SRR_4X3Y3
SRR_4X4Y4
SRR_4X5Y5
SRR_4X6Y6
SRR_99X1Y1
SRR_99X3Y3
SRR_99X5Y5
SRR_99X7Y7
SRR_99X9Y9
SRR_99X11Y11
SRR_99X13Y13
    • good
    • 0

基本的には


・「SRRほげほげ」の部分が前と同じならたんに出力
・変わったら新しいファイルをオープンしてそっちに出力
というだけ. やりようはいろいろ.
    • good
    • 0

その「SRR 以降の数字」がいろいろと混ざる (つまり SRR_1, SRR_2, SRR_3 となったあとでまた SRR_1 が

出てくる, など) ことはあり得ますか?

この回答への補足

ソートしてあるので、同じ数字が後でもう一度出てくることはありません。

補足日時:2011/11/18 14:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!