Supponiamo di avere i seguenti file di testo, chiamati ad esempio Mil2006.txt e Mil2007.txt, ottenuti dai corrispondenti PDF con pdftotext e riferiti ad un'ipotetica popolazione scolastica milanese:

Tabella demografica Milano anno 2006

Prima       1
Seconda     2
Terza       3

e

Tabella demografica Milano anno 2007

Prima       11
Seconda     22
Terza       33

Vorrei compilare uno script bash per elaborare i dati di questi documenti ed ottenere come output il file di testo seguente:

Tabella demografica Milano

                   2006           2007

seconda               2             22

Usando

awk 'NR==5 {print $2} ' Mil2006.txt >> output.txt

sono riuscito ad estrarre il dato di interesse del primo file (insomma il valore 2), che in questo esempio si trova nella quinta riga in seconda posizione; però vorrei poter decidere quale posizione fargli occupare nel file di output (ad esempio in quinta riga dopo 3 tabulazioni...).
Inoltre nel secondo file il dato di interesse non è più in quinta ma in sesta riga: c'è un modo per farlo riconoscere (ad esempio in quanto preceduto in entrambi i casi dalla parola "Seconda")?
Un ringraziamento anticipato a chi volesse aiutarmi.

chiesto 13 Nov '14, 14:40

piccolo%20principiante's gravatar image

piccolo prin...
157132027

modificato 13 Nov '14, 20:27

enzotib's gravatar image

enzotib ♦♦
14.0k112186

Scusate, mi accorgo solo che a causa della mia poca abilità con la sintassi markdown i due file da elaborare sembrano uno solo.

(13 Nov '14, 14:47) piccolo prin... piccolo%20principiante's gravatar image

Ecco una soluzione

#!/bin/bash

# Il ciclo estrae anno e valore del campo "seconda" da ogni file si testo
for f in *.txt; do
  awk 'NR == 1  { year = $NF }
      /Seconda/ { value = $2 }
      END       { print year, value }' "$f"
done |
  awk '{ year[NR] = $1; value[NR] = $2 } 
       END { 
         printf("Tabella demografica Milano\n\n");

         printf("%-13s", "")
         for (i = 1; i <= NR; i++)
           printf("%15d", year[i])
         printf("\n\n")

         printf("%-13s", "seconda")
         for (i = 1; i <= NR; i++)
           printf("%15d", value[i])
         printf("\n")
       }'
coll. permanente

ha risposto 13 Nov '14, 21:08

enzotib's gravatar image

enzotib ♦♦
14.0k112186

La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×93
×48

domanda posta: 13 Nov '14, 14:40

domanda visualizzata: 766 volte

ultimo aggiornamento: 13 Nov '14, 21:08

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.