• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlを使ってファイル分割)

perlを使ってファイル分割する方法

このQ&Aのポイント
  • この記事では、perlを使ってタブ区切りのファイルを分割する方法について解説します。
  • 具体的には、一列目の特定の文字列が変わるごとにファイルを分割する方法を紹介します。
  • perlの基礎知識が必要ですが、初心者でも理解しやすいように解説しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • namboku
  • ベストアンサー率50% (2/4)
回答No.3

基本的にはキーブレイク処理の応用で対応できます。 キーブレイクした最初のデータごとに出力ファイルをオープンしていき、 オープンした出力ファイルに出力する方法をとります。 具体的には以下のような手順になります。 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); ※上記は、スクリプトを見やすくするために全角スペースを含んでいます。  このまま、コピー・ペーストしても実行できませんので、ご注意ください。

kjng
質問者

お礼

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

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

だいぶ手抜き。 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_1 X1 Y1 SRR_1 X2 Y2 SRR_1 X3 Y3 SRR_2 X1 Y1 SRR_2 X2 Y2 SRR_3 X1 Y1 SRR_4 X2 Y2 SRR_4 X3 Y3 SRR_4 X4 Y4 SRR_4 X5 Y5 SRR_4 X6 Y6 SRR_99 X1 Y1 SRR_99 X3 Y3 SRR_99 X5 Y5 SRR_99 X7 Y7 SRR_99 X9 Y9 SRR_99 X11 Y11 SRR_99 X13 Y13

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その「SRR 以降の数字」がいろいろと混ざる (つまり SRR_1, SRR_2, SRR_3 となったあとでまた SRR_1 が出てくる, など) ことはあり得ますか?

kjng
質問者

補足

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