天使と悪魔選手権

ファイル内のデータの並び替え処理したく、質問します。
データは、1列目に通し番号、2、3、4列目にデータが入っています(下に例を書きます)。
5行ごとに5つの行のデータをまとめたいのです。
具体的に言うと、「1、6、11、16、21行目」のデータをまとめて1行(タブ切り)に。新しい行には、真ん中の数字「11」を先頭列に入れたいです。
それをずらしてゆき、「2、7、12、17、21行目」のデータを1行に、、というようにしたいのです。
扱うファイルの行数は、様々です。
これを統計処理を行う予定です。perl初心者ですので、トライした思案策を載せても参考にならないかと思い、0から教えて頂く形になりますが、よろしくお願いします。

1101010
2202020
3303030
4404040
5505050
6101010
7202020
8303030
9404040
10505050
11101010
12202020
13303030
14404040
15505050
16101010
17202020
18303030
19404040
20505050
21101010
22202020
23303030
24404040
25505050

出来上がりは、
11 10 10 10 10 10 10 10 10 10
12 20 20 20 20 20 20 20 20 20
というようになります。

A 回答 (2件)

以下効率や「分かりやすさ」は完全に無視.



とりあえず「5行おき」を無視して「5行ずつ」でその処理をすることはできますよね? 例えば
sub collect {
my @lines = @_;
my @data = (split ' ', $lines[2])[0];
for my $l (@lines) {
push @data, (split ' ', $l)[1..3];
}
print join("\t", @data), "\n";
}
で表示できます. あとは, 読み込んだ全データに対してこれを回せばいいので
@lines = <>;
for my $i (20..$#lines) {
collect(@lines[$i-20, $i-15, $i-10, $i-5, $i]);
}
でいけそう.
    • good
    • 0
この回答へのお礼

ありがとうございます。下手な質問に付き合って頂きありがとうございました。
行をarrayにして、、という処理でしょうか。勉強になります。
まだ解読出来ていませんが、スキルアップのため、理解しながら使用したいと思いますので、お礼を先に申し上げます。

お礼日時:2013/05/17 15:22

これは正直何をしたいのかがさっぱりわからないな~.



まず, 「1列目」とか「2、3、4列目」とかがどこなのか分からん. そして, 「扱うファイルの行数は、様々です」という前提で「5行ごとに5つの行のデータをまとめたい」というのがどのような形を期待しているのか不明. 例えば, 元のデータが 68行あるとしたら,結果はどうしたいの?

さらに「新しい行には、真ん中の数字「11」を先頭列に入れたいです」とあるのですが, この「11」がどこから出てきたのかが分かりませんし, ここに与えられたデータからなぜこの「出来上がり」になるのかも全く理解できない.

この回答への補足

確認画面と表テーブルの表示が随分異なり、tab切りが不明瞭でした。それに加え、説明が不十分でした。
表にtab切り(¥t)を入れました。
1列目 ¥t 2列目 ¥t 3列目 ¥t 4列目
1\t 10\t 10\t 10
2\t 20\t 20\t 20
3\t 30\t 30\t 30
4\t 40\t 40\t 40
5\t 50\t 50\t 50
6\t 10\t 10\t 10
7\t 20\t 20\t 20
8\t 30\t 30\t 30
9\t 40\t 40\t 40
10\t 50\t 50\t 50
11\t 10\t 10\t 10
12\t 20\t 20\t 20
13\t 30\t 30\t 30
14\t 40\t 40\t 40
15\t 50\t 50\t 50
16\t 10\t 10\t 10
17\t 20\t 20\t 20
18\t 30\t 30\t 30
19\t 40\t 40\t 40
20\t 50\t 50\t 50
21\t 10\t 10\t 10
22\t 20\t 20\t 20
23\t 30\t 30\t 30
24\t 40\t 40\t 40
25\t 50\t 50\t 50

1行3個のデータが入っており、5行おきに5行分のデータを集めるので、5x3=15個のデータが新しい1行に集められます。
1、6(1+5)、11(6+5)、16(11+5)、21(16+5)行にあるデータを集めた場合、新しい行の先頭列には、集めた行の3番目の数字11を入れておきたいのです。
68行までしかない場合は、64、65、66、67、68行について処理したら終了したいと思います。
統計のT検定をおこなうための標本を作っています。

結果は、
11 \t 10 \t 10\t 10 \t 10 \t 10 \t 10 \t 10 \t 10 \t 10 \t 10 \t 10 \t 10\t 10 \t 10 \t 10¥n
12 \t 20 \t 20\t 20 \t 20 \t 20 \t 20 \t 20 \t 20 \t 20 \t 20 \t 20 \t 20\t 20 \t 20 \t 20¥n
としたいと思います。

補足日時:2013/05/17 14:01
    • good
    • 0

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