Summieren Sie alle Zeilen einer CSV-Datei

Summieren Sie alle Zeilen einer CSV-Datei

Ich habe eine CSV-Datei mit einigen Zahlen und möchte eine neue Datei mit der gleichen Anzahl Zeilen und einer Spalte mit der Summe der Zahlen der entsprechenden Zeile in der ursprünglichen CSV-Datei erhalten.

Eingabebeispiel(Beachten Sie die Leerzeichen, ich hoffe, das stellt kein Problem dar)

 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

Erwartete Ausgabe

2
4
5
6
7

Mein Code(erzeugt keine Ausgabe):

    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}"

Sie können auch andere Tools als awk vorschlagen, aber ich würde gerne wissen, warum mein Code nicht funktioniert, vielleicht wegen der Leerzeichen (ich glaube nicht).

Antwort1

Sie benötigen keine temporären Werte. Führen Sie es einfach aus awkund leiten Sie die Ausgabe in eine Datei um.

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}"

Antwort2

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

verwandte Informationen