mercoledì 23 novembre 2011

Come faccio a sommare i numeri contenuti in un file di testo?

Io e il caro Lightuono abbiamo deciso di dare vita ad una nuova sezione del progetto bash: "Botta e Risposta"

C'è poco da dire al riguardo, ci si pone delle domande (su bash, ovvio! :D) e si cerca di dare una risposta. Ovviamente noi daremo una risposta, ma non è detto che sia l'unica possibile.


Insomma è importante anche il vostro contributo. Posta la domanda, saremo ben lieti di accogliere ulteriori soluzioni. :)

Ho un file di testo (miofile.txt) dove i numeri sono disposti nel modo seguente:

5
27
89
90
21
88
77


Per fare la somma dei numeri disposti in colonna, lancio il seguente script:

#!/bin/bash

somma=0

while read -r riga

 do
     somma=$((somma += riga))

 done < $1


echo $somma

exit 0



Risultato:

$./somma.sh miofile.txt

397

PS1. Io personalemente faccio altro nella vita, non sono affatto un programmatore. Chi, invece, ne sa veramente tanto su bash è il caro Light. E' meglio che si sappia, senza di lui non ci sarebbe stato alcun progetto bash, tanto meno quest'ultima iniziativa.
PS2. Il vostro contributo è essenziale.
PS3. Presto aggiungeremo un link nell'indice del progetto bash che rimanda alla pagina "Botta e Risposta".

Ciao :)

6 commenti:

  1. Ed ecco qui una semplificazione o alternativa del comando ;) :

    for i in $(cat NOMEFILE); do somma=$((somma+i)); done && echo $somma

    RispondiElimina
  2. Io invece farei in questo modo utilizzando il comando awk:

    awk '{somma +=$1} END { print somma }' miofile.txt

    Ciao

    Jamil

    RispondiElimina
  3. @Jamil

    caspita awk! Vero non ci avevo pensato XD

    RispondiElimina
  4. Vediamo se riesco a spiegarmi: io ho un file formato da 49044 righe di numeri divisi fra loro da ; a formare una specie di matrice con 41 colonne.
    Es: 34; 45; 65; ...
    45; 67; etc..
    Io vorrei realizzare un nuovo file mantenendo lo stesso formato a 41 colonne, in cui ogni riga corrisponde alla media sulle colonne di 12 righe del file originale.
    Mi spiego meglio: la prima riga sarà formata da 41 numeri ottenuti facendo la media colonna per colonna dei numeri contenuti nelle prime 12 righe del file originale; la seconda sarà la media delle righe 13-24 e via così.
    Qualcuno sa come fare? Ovviamente in bash. Grazie

    RispondiElimina
    Risposte
    1. Lo puoi fare con awk! Se ti può essere d'aiuto, sto curando una guida, su questo blog... Quando avrò più tempo, ti saprò dare una risposta più precisa! :)

      Elimina