Como adicionar variáveis à saída do script?

2

Um programa para calcular estatísticas produz seus dados neste formato

Calc_Statistics -input_data
zone|label|non_null_cells|null_cells|min|max|range|mean|mean_of_abs|stddev|variance|coeff_var|sum|sum_abs
1|Category 1|2340|6|0.281038027256727|0.462105994578451|0.181067967321724|0.408569300865444|0.408569300865444|0.0272405706818114|0.000742048691070761|6.66730726564858|956.0521640251|956.0521640251
2|Category 2|1504|11|0.231816699029878|0.428150941850618|0.19633424282074|0.368851480689277|0.368851480689277|0.0237446334053689|0.000563807615555358|6.43745101985139|554.7526269567|554.7526269567
...
...
n

Eu sei como selecionar os valores que eu quero com o corte

calc_statistics -input_data | cut -f1,2,34 -d'|'

e eu vou conseguir algo assim:

zone|label|non_null_cells|null_cells
1|Category 1|2340|6
2|Category 2|1504|11

E eu quero executá-lo para uma coleção de entradas, por exemplo:

for year in years:
    do 
    for month in months:
       do
       calc_statistics -input_data $year$month_data | cut -f1,2,34 -d'|' >> results.txt
       done
    done

mas como posso adicionar em cada linha a variável $ ano e $ mês para que o resultado seja semelhante ao seguinte?

2000|2|1|Category 1|2340|6
2000|2|2|Category 2|1504|11
    
por user528025 09.07.2012 / 16:24

1 resposta

3

Imprima separadamente. echo é bom o suficiente para ter uma opção ( -n ) que faz pular a nova linha final:

for year in years:
    do 
    for month in months:
       do
       echo -n "$year|$month|"
       calc_statistics | cut -f1,2,34 -d'|' >> results.txt
       done
    done

Como alternativa, transmita-os para calc_statistics e imprima-os também (em seguida, ajuste a chamada cut apropriadamente). Seu exemplo é um pouco estranho, já que $month e $year não são usados.

EDITAR: Ah, nesse caso, você poderia usar paste , mas é muito mais simples fazer isso com aplicativos de edição de texto. No meu caso sed :

for year in years:
    do 
    for month in months:
       do
       calc_statistics | cut -f1,2,34 -d'|' | sed "2,$ s/^/$year|$month|/" >> results.txt
       done
    done

O que ele faz é ler cada linha após a primeira ( 2,$ significa o intervalo de linhas) e substitui o início da linha ( ^ ) pelos valores desejados. Tudo antes de salvar a string no arquivo de resultados.

    
por 09.07.2012 / 16:29