Olá,
preciso de ajuda para modificar um script em perl, que gera tabelas baseado na contagem de elementos de colunas de um arquivo de entrada qualquer.
o script, faz a contagem e organiza, mas não consigo modifica-lo para escrever a saída como desejo, para usar tal como entrada no gnuplot e criar os histogramas que preciso nas minhas pesquisas;
o arquivo de entrada tem o seguinte formato ( input.txt )
14 11 22 20 15 06 25 23 29 09
10 10 27 31 10 06 31 02 31 06
13 17 26 29 25 15 23 18 04 27
03 23 05 07 23 09 00 15 27 31
15 12 11 13 11 00 31 26 21 23
13 17 26 29 25 17 23 18 04 27
03 23 05 07 23 09 02 15 27 31
são 10 colunas, cujos valores em cada coluna pode variar de 00 a 31, e número de linhas variáveis, indo de 10 a 1000 !
o arquivo de saída que desejo tem o seguinte formato ( output.txt )
Index C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
00 - 00 00 00 00 00 01 01 00 00 00
01 - 00 00 00 00 00 00 00 00 00 00
02 - 00 00 00 00 00 00 01 01 00 00
..
..
31 - 00 00 00 01 00 00 02 00 01 02
e assim sucessivamente.
o script que possuo gera o seguinte resultado, sem colocar os índices faltantes com valor 00
column 1:
03 2
10 1
13 2
14 1
15 1
column 2:
10 1
11 1
12 1
17 2
23 2
column 3:
05 2
11 1
22 1
26 2
27 1
column 4:
07 2
13 1
20 1
29 2
31 1
column 5:
10 1
11 1
15 1
23 2
25 2
column 6:
00 1
06 2
09 2
15 1
17 1
column 7:
00 1
02 1
23 2
25 1
31 2
column 8:
02 1
15 2
18 2
23 1
26 1
column 9:
04 2
21 1
27 2
29 1
31 1
column 10:
06 1
09 1
23 1
27 2
31 2
em outras palavras, quero criar uma tabela de saída com tais dados organizados, e onde não houver o índice, preencher com zero na posição correspondente.
alguém pode me orientar em como proceder ?
script perl:
# uso: perl column_values.pl input.txt
# No loop while de nível superior:
# * Loop sobre cada linha dos arquivos de entrada combinados
# * Divida a linha na matriz @Fields
# * Para cada coluna, incremente a estrutura de dados da matriz de hashes do resultado
while (<>) {
@Fields = split / /;
for $i ( 0 .. $#Fields ) {
$result[$i]{$Fields[$i]}++
};
}
# No nível superior do loop:
# * Loop sobre a matriz de resultados
# * Imprime o número da coluna
# * Obtenha os valores usados nessa coluna
# * Classifique os valores pelo número de ocorrências
# * Classificação secundária com base no valor (por exemplo b vs g vs m vs z)
# * Iterar através do hash de resultado, usando a lista classificada
# * Imprimir o valor e o número de cada ocorrência
for $j ( 0 .. $#result ) {
print "column $j:\n";
@values = keys %{$result[$j]};
@sorted = sort { $result{$b}[$j] <=> $result{$a}[$j] || $a cmp $b } @values;
for $k ( @sorted ) {
print " $k $result[$j]{$k}\n"
}
}
agradeço antecipadamente qualquer ajuda e ou orientação.