Извлечение непрерывных значений и печать всех строк - PullRequest
1 голос
/ 02 марта 2012

Я хочу извлечь строки, если значения непрерывны для более чем 4 строк (если значение в столбце col1 одинаковое), но все строки (более 4 должны быть напечатаны) должны быть напечатаны.

Еслизначение в col1 равно, а значения в col2 и col3 идут непрерывно (как непрерывные числа) для более чем 4 следующих строк, а затем возвращают эти строки.Значение в col3 строки может быть равным или может быть меньше только до 100 на значение col2 следующей строки.

Здесь непрерывный не означает для 1 строки (что в 1 строке col3 - col2).Это означает значение col3 строки по сравнению со значением col2 следующей строки.

Мой файл ->

A   0    100
A1  0    100
A1  100  200
A1  200  300
A1  400  500
A1  500  600
A1  600  700
A1  700  800
A1  1600 1700
A2  100  200
A2  200  300
A2  400  500
A2  500  600
A2  600  700
A3  800  900

Требуемый вывод ->

A1  0    100
A1  100  200
A1  200  300
A1  400  500
A1  500  600
A1  600  700
A1  700  800
A2  100  200
A2  200  300
A2  400  500
A2  500  600
A2  600  700

Здесьэто еще один пример -> мой входной файл ->

A   0    100
A1  0    100
A1  100  200
A1  200  300
A1  500  600
A1  600  700
A1  700  800
A1  1600 1700
A2  100  200
A2  200  300
A2  400  500
A3  800  900

Вывод ->

"Нет строк непрерывных".

Теперь нет вывода, потому что должендолжно быть больше 4 строк, которые имеют одинаковое значение col1 и значение col3 этих строк должно быть равно или меньше на 100, по сравнению со следующей строкой.

Пока я пробовал это, но не работает ->

use strict;
use warnings;

*ARGV or die "No input file specified";
open *first, '<',$ARGV[0] or die "Unable to open input file: $!";
my @data;
while (<first>) {

     if (not @data) {
     @data = split;
     next;
     }

     my @new = split /\s+/;

     if ($new[0] eq $data[0] and $new[1] <= $data[2]+ 100) {
     $data[2] = $new[2];
          if ( $data[2] - $data[1] >= 500){
             print join("\t", @new), "\n";
          }
     }

    else {
    @data = @new;
    }
}

Любая помощь, пожалуйста.

1 Ответ

2 голосов
/ 02 марта 2012

Как насчет:

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dump qw(dump);
use 5.010;

$_ = <DATA>;
chomp;
my ($p_key, $p_col1, $p_col2) = split;
my @result = ($_);
open my $fh, '>', 'path/to/output_file' or die "unable to open file:$!";
while(<DATA>) {
    chomp;
    my ($key, $col1, $col2) = split;
    if ($key eq $p_key) {
        if ($col1 <= $p_col2+100) {
            push @result, $_;
        } else {
            print_to_file($fh, \@result) if (@result > 3);
            @result = ();
        }
    } else {
        print_to_file($fh, \@result) if (@result > 3);
        @result = ($_);
    }
    ($p_key, $p_col2) = ($key, $col2);
}
print_to_file($fh, \@result) if (@result > 3);

sub print_to_file {
    my $fh = shift;
    my $res = shift;
    while(@$res) {
        print $fh, $_, "\n";
    }
}
__DATA__
A   0    100
A1  0    100
A1  100  200
A1  200  300
A1  400  500
A1  500  600
A1  600  700
A1  700  800
A1  1600 1700
A2  100  200
A2  200  300
A2  400  500
A2  500  600
A2  600  700
A3  800  900

Вывод:

(
  "A1  0    100",
  "A1  100  200",
  "A1  200  300",
  "A1  400  500",
  "A1  500  600",
  "A1  600  700",
  "A1  700  800",
)
(
  "A2  100  200",
  "A2  200  300",
  "A2  400  500",
  "A2  500  600",
  "A2  600  700",
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...