Processamento de texto usando o Linux

0

Eu preciso escrever um programa Linux, que leia partes de dados de um arquivo csv e escreva em um arquivo de texto no seguinte padrão.

NAME : FROM= -100 -346 -249 -125 TO= -346 -249 -125 100 COLOR= COLOR1 COLOR2 COLOR3 COLOR4

NAME será uma linha fixa,

As informações de

FROM e TO devem ser recuperadas do arquivo csv e

As informações de cores podem ser uma matriz de cores codificadas do próprio programa.

A partir dos dados csv abaixo, o primeiro valor (-100) sob MIN será o primeiro valor (-100) sob FROM do arquivo de texto. O último valor (100) da coluna excel MAX será o último valor (100) na coluna TO do arquivo de texto. Os valores na coluna VALUE no Excel serão arredondados e usados como TO e FROM por padrão mostrado.

Data,VALUE,
100,-345.8756,
200,-249.3654,
300,-125.3554,
COUNT,MIN,MAX
1,-100,-98
93,84,86
98,94,96
99,96,98
100,98,100

    
por NewCoder 25.09.2017 / 16:35

2 respostas

1

Um programa awk :

BEGIN           { FS = ","; col = "COLOR1"; i = 1 }
!/^[0-9]/       { next }

$3 == ""        {
                    val = sprintf("%.0f", $2)
                    data = data ? data OFS val : val
                    col = col OFS "COLOR" ++i
                    next
                }

$2 < min        { min = $2 }
$3 > max        { max = $3 }

END {
        printf("NAME:\nFROM= %s %s\nTO= %s %s\nCOLOR= %s\n",
               min, data, data, max, col)
    }

Teste:

$ awk -f script.awk file.csv
NAME:
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4

Eu estou supondo que pode haver mais linhas (mas não colunas) de dados, tanto na primeira quanto na segunda seção do arquivo, e que deve haver tantas COLOR entradas na linha COLOR . são valores de dados nas linhas FROM e TO na saída.

Linhas não numéricas são ignoradas pelo bloco !/^[0-9]/ .

Os dados repetidos na saída são selecionados pelo terceiro bloco ( $3 == "" ). Esse bloco cria uma string data e uma col com os valores apropriados. O arredondamento é executado usando sprintf() com um formato especificando um número de ponto flutuante sem casas decimais.

Os valores mínimo e máximo são coletados da seção posterior do arquivo de entrada como o mínimo da segunda coluna e o máximo da terceira coluna.

O bloco END imprime o relatório resultante.

    
por 25.09.2017 / 17:27
2
Solução

awk (para o seu arquivo de entrada atual):

awk 'NR>1 && NR<5{ 
         v=sprintf("%.0f", $2); values=(values)? values FS v : v; 
         lbl="COLOR"; col_item=lbl""++c; col=(col)? col OFS col_item : col_item 
     }
     NR==6{ from=$2 }
     END{ 
         print "NAME :"; print "FROM=",from,values; 
         print "TO=",values,$3; print "COLOR=",col,lbl""++c 
     }' file

A saída:

NAME :
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4
    
por 25.09.2017 / 17:04