ーーーーーーーーーーーー
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で質問しましょう!
似たような質問が見つかりました
- 数学 数学直線の方程式とベクトル方程式について 直線の方程式で 点(x1,y1)を通り、直線ax+by+c 1 2022/08/12 12:13
- 数学 写真の図は中心(a,b)半径rの円とその円周上の(x1,y1)における接線lと円の中心とlを結ぶ任意 4 2023/08/08 16:20
- Visual Basic(VBA) エクセル VBAについて教えてください 2 2023/04/26 13:25
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- 数学 数学(ベクトル) 単位ベクトルの一次結合で一般の空間ベクトルは表せる という式なのですがなぜ 「x1 3 2023/04/10 01:24
- Excel(エクセル) エクセルで同じ数字同士を自動で線で結ぶVBAを教えてください 6 2022/04/26 23:13
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
-
DOSコマンドで、標準出力を出力...
-
重複するデータを抽出できる秀...
-
教えて!perlから.exeファイル...
-
テキストファイルから日本語部...
-
ドメインからIPアドレスあるい...
-
window.open でのファイル指定方法
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
fgets で値が取得できない
-
エクセルVBA コードが同じでも...
-
配列の中に重複文字列があるか...
-
MATLABのm-fileについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
sprintfについて
-
教えて!perlから.exeファイル...
-
重複するデータを抽出できる秀...
-
log2の「正確な」計算方法
-
DOSコマンドで、標準出力を出力...
-
文字コードの変換(Shift-JISか...
-
perlでの文字列抽出
-
至急お願いします。C言語で.img...
-
ダイアモンド演算子<>に対するb...
-
コマンドプロンプトで行が見え...
-
Perlで着メロDLカウント
-
perlのpushについてです。
-
perlでcsvの出力について
-
CGIから外部コマンド実行時の標...
-
ドメインからIPアドレスあるい...
-
MySQLに画像を格納してperlで取...
-
perlでcsvの指定フィールドに書...
-
htmlから、ファイル、もしくはC...
おすすめ情報