/ / como processar dados de arquivo usando hashes em perl - perl, arquivo-io, hash

como processar dados do arquivo usando hashes no perl - perl, file-io, hash

#input data
11000000,        1637,        -7.8737,      -20.15022
11000001,        1634,       -710.377,      -20.150137
11000002,        1639,       -709.87366,    -20.150133
11000003,        1631,        -7.1737,      -22.650156
11000004,        1639,        709.87366,    -20.150133
11000005,        1630,       -710.6,        -22.650074

Eu quero esta saída, imprima valores da segunda coluna que são iguais, imprima valores da terceira coluna que são iguais, mas têm sinal oposto, e também imprima valores da quarta coluna que são iguais.

1639,          709.87366,       -20.150133

Respostas:

0 para resposta № 1

Talvez assim:

while (<DATA>) {
chomp;
@datas = split/,s+/;
$k = sprintf "%s:%s:%s", $datas[1], abs $datas[2], $datas[3];
print join(",t", @datas[1..3]), "n" if (++$hash{$k} > 1);
}

__DATA__
11000000,        1637,        -7.8737,      -20.15022
11000001,        1634,       -710.377,      -20.150137
11000002,        1639,       -709.87366,    -20.150133
11000003,        1631,        -7.1737,      -22.650156
11000004,        1639,        709.87366,    -20.150133
11000005,        1630,       -710.6,        -22.650074

3 para resposta № 2

você pode simplesmente ler o arquivo linha por linha, então

@numbers = split /s+/, $line;

ou

# includes comma in the split pattern to select just the number
@numbers = split /,s+/, $line;

e selecione

$numbers[1], $numbers[2], $numbers[3]

Um script simples que imprime o que você solicitou pode ser:

#!/usr/bin/perl -w

use strict;

open FILE, "<", "input.txt";

foreach my $line (<FILE>)
{
my @numbers = split /,s+/, $line;
printf "%d,t%f,t%fn", $numbers[1], -1*$numbers[2], $numbers[3];
}

close FILE;