Somma tutte le righe di un file CSV


0

Ho un file .csv, con alcuni numeri, voglio ottenere un nuovo file con lo stesso numero di righe e una colonna, con la somma dei numeri della riga corrispondente nel file .csv originale.

Esempio di input (notare gli spazi bianchi, spero che questo non sia un problema)

 2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 3,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 4,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 5,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
 6,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0

Uscita prevista

2
4
5
6
7

Il mio codice (non produce alcun output):

    file_out="output.txt"
    file_in="input.txt"
    cmd3="sum_file=\$(awk -F, '
    {
        sum = 0; 
        for (i=1; i<=NF; i++) {
            sum += \$i;
        }
        print sum;
    }
    ' ${file_in})"
    echo $cmd3
    eval $cmd3
    eval "echo ${sum_file} > ${file_out}"

Puoi anche proporre strumenti diversi da awk, ma sarei felice di sapere perché il mio codice non funziona, forse a causa degli spazi bianchi (non credo).


Perché stai memorizzando il tuo codice in una variabile e poi evallo stai ing? Sembra molto contorto. Ci sono dei requisiti che non ci stai dicendo?
Glenn Jackman,

Aspetta, quale uscita ti aspetti? Allo schermo? Stai reindirizzando al file di output. Quel file è vuoto?
Glenn Jackman,

@glennjackman, il problema era nell'ultima riga. Avrei dovuto usare \${sum_file}. Stavo usando eval per scopi di debug, poiché era facile riecheggiare le linee. Ma così facendo ho introdotto un nuovo bug :( Almeno ora è risolto
Nisba,

Risposte:


2

Non hai bisogno di alcun valore temporaneo. Basta eseguire awke reindirizzare l'output su file.

file_out="output.txt"
file_in="input.txt"
awk -F, '
{
    sum = 0; 
    for (i=1; i<=NF; i++) {
        sum += \$i;
    }
    print sum;
}
' "${file_in}" > "${file_out}"

1
Non è nemmeno necessario avere i nomi dei file nelle variabili. Se lo fai, dovrebbero essere racchiusi tra virgolette doppie. (Sembra funzionare bene fintanto che i nomi dei tuoi file sono banali, ma quando si interrompe, ne troviamo un altro nella discarica di disperate domande per i principianti sul perché questo non funziona sui nomi dei file con asterischi, spazi, parentesi quadre ecc. In i loro nomi.)
tripleee

Buon punto, @tripleee
Tomasz Jakub Rup,

sum += \$i;causa un errore di sintassi a meno che non faccia parte di eg cmd3="...".
simlev,

1

awk:

awk -F, '{sum=0; for (i=1; i<=NF; i++) {sum+= $i} print sum}' input.txt > output.txt

perl:

perl -F, -lane '$s=0; $s+=$_ for @F; print $s' input.txt > output.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.