[ Существует несоответствие между заявленным желаемым выходом OP (10 -1 -6
) и выводом, произведенным предоставленным кодом awk
(10 -1 6
). В этом ответе предполагается, что OP хочет, чтобы вывод производился с помощью предоставленного кода awk
. ]
#!/usr/bin/perl
use strict;
use warnings;
use feature qw( say );
my %incs_by_sign = ( "+" => 1, "-" => -1 );
# Skip header.
defined(scalar(<>))
or exit;
my $val = 0;
my $i;
while (<>) {
my (undef, $sign, $x, $y) = split;
if (defined($i)) {
# Backfill the gap.
for (; $i<$x; ++$i) {
say join "\t", $i, 0, $val;
}
} else {
$i = $x;
}
# Flatten.
my $inc = $incs_by_sign{$sign};
for (; $i<=$y; ++$i) {
$val += $inc;
say join "\t", $i, $inc, $val;
}
}
В качестве сжатого "однострочного":
perl -lane'
BEGIN { $, = "\t"; }
next if $. == 1; # Skip header.
$i //= $F[2];
print $i++, 0, $val while $i < $F[2];
my $inc = 0 + ( $F[1] . 1 );
print $i++, $inc, $val += $inc while $i <= $F[3];
'
Выход:
1 1 1
2 1 2
3 1 3
4 0 3
5 1 4
6 1 5
7 1 6
8 1 7
9 0 7
10 -1 6
11 -1 5
12 -1 4
Оба решения предполагают, что входной файл отсортирован по координатам.
И сценарий, и однострочный принимают входные данные из файла, названного его параметром, или из STDIN, если параметров нет предоставляются.