
ーーーーーーーーーーーー
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初心者ですが、どうかよろしくお願いします。
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);
※上記は、スクリプトを見やすくするために全角スペースを含んでいます。
このまま、コピー・ペーストしても実行できませんので、ご注意ください。
ソースを書いていただきありがとうございます。
"SRR_"以下の数字は4桁までありましたが、一部修正することによって問題なく処理できました。
ありがとうございます。
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_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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複するデータを抽出できる秀...
-
LWPでPOST送信した後に送信先に...
-
Perlでファイルの末尾から指定...
-
sprintfについて
-
Perl<->Oracle間での文字化けに...
-
VBAでCSVファイルを途中行まで...
-
Windowsで複数のファイルを同じ...
-
MATLABのm-fileについて
-
readdir()で得られるファイル・...
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
dos変数の%~dp0は powershellで...
-
MATLAB std::exceptionエラー
-
batファイルでrenameができませ...
-
htaccessで特定のディレクトリ...
-
C言語で特定の行を抽出する方法...
-
FindFirstFileとFindNextFileで...
-
ファイルの削除について
-
ReadLineでの読み出し行を指定する
-
対比較データを表データに変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
DOSコマンドで、標準出力を出力...
-
[awk]uniq -cで複数ファイルの...
-
sprintfについて
-
大量メールの任意のヘッダだけ...
-
log2の「正確な」計算方法
-
[Perl]ファイル出力のエンコー...
-
重複するデータを抽出できる秀...
-
Perl<->Oracle間での文字化けに...
-
文字コードの変換(Shift-JISか...
-
テキストファイルから日本語部...
-
htmlから、ファイル、もしくはC...
-
ファイル出力の改行コードをLFに
-
sprintfで10進数を桁数指定で16...
-
Perl 時間同士の差
-
warnやdieの出力先を変更したい
-
Perlでエラーログに日時をつける
-
エディターでは改行なのにメモ...
-
perlでモジュールを使ってクロ...
おすすめ情報