次のデータファイルがあります。
1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3
2 4 5 8 9 10 13 17 19 29 30 32 33 50 700 800 900 950
まず、3つの同じ値の間にスペースを挿入し、最初の行を見て3つの同じ数字を1つの列に配置しようとしています。
1 1 1 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3
2 4 5 8 9 10 13 17 19 29 30 32 33 50 700 800 900 950
次に、2行目の各新しい列の最後の値から最初の値を減算したい(ただし、特定の列(ここでは2行目の4列目)に値が1つしかない場合は、前の列の最後の最初の行の各列に固有です。 1つの数字を保持しながら、この値(32〜30)から値を減算する必要があります。したがって、最終データは次のようになります。
1 1 1 2 2 3 3
3 2 4 11 2 667 150
どんな提案がありますか?また、私の実際のデータが本当に大きく、最初の行で5つの固有値をグループ化したいことにも言及する必要があります。グループのサイズを変更したい場合があります。だからスクリプトは柔軟でなければなりません。
ベストアンサー1
Perlが救出に来る!
#!/usr/bin/perl
use warnings;
use strict;
my $group_size = 3;
my @first = split ' ', <>;
my @groups;
my $start_index = 0;
while ($start_index < @first) {
my $step = 1;
while ( $step < $group_size
&& $start_index + $step < @first
&& $first[$start_index] == $first[ $start_index + $step ]
) {
++$step;
}
push @groups, $step;
print $first[$start_index], ' ';
$start_index += $step;
}
print "\n";
my @numbers = split ' ', <>;
my $last;
for my $size (@groups) {
my @group = splice @numbers, 0, $size;
my $value = $group[-1] - $group[0];
$value = $group[0] - $last if 1 == $size;
$last = $group[-1];
print $value, ' ';
}
print "\n";
最初のグループにメンバーが1つしかない場合はどうなるかを指定していません。