Shell

如何從shell中一行的列中的最後一個值中減去第一個值?

  • January 29, 2016

我有一個數據文件看起來像:

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 個相同的值之間插入空格,將每三個相同的數字保持在一個列中:

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

然後我想從第二行的每個新列中的最後一個值中減去第一個值(但是如果特定列中只有一個值(這裡是第二行的第四列),那麼上一列的最後一個值應該從該值中減去(32-30)),同時在第一行的每一列中保留一個唯一數字。所以最終的數據應該是這樣的:

1 1 1 2 2 3 3
3 2 4 11 2 667 150 

請問有什麼建議嗎?同時我應該提到我的真實數據確實很大,我想在第一行對每 5 個唯一值進行分組。我可能想更改 group 的大小。所以我需要腳本靈活..

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";

如果第一個組只有一個成員,您還沒有指定應該發生什麼。

引用自:https://unix.stackexchange.com/questions/258534