Summieren Sie die Werte in einer Spalte mit Ausnahme der Kopfzeile


9

Ich habe eine Datei wie unten angegeben

--------------------------------------------------------------
Name_Customer   Item_Purchased  Item_Amount Credit
--------------------------------------------------------------
Tom              H1_P            7657        N/A    
Pras             Track_1         23          N/A
Cha              Brace           9           N/A
Moh              kite37          269         N/A
Prab             Bols            87699       N/A

Ich muss die Werte unter der Spalte hinzufügen, Item_Amountindem ich den Header in der Datei ignoriere und die Summe als drucke

Total Amount collected = 95657

Antworten:


14
awk '{s+=$3}END{print s}' yourfile

1
@coffeMug können Sie erklären, warum dies verwenden: s+0?.
Kalter

@Cold weiß nicht genau, warum diese 0 da ist! :-P Scheint unnötig zu sein, also entferne es!
Kaffee Tasse

1
@coffeMug wahrscheinlich, um sicherzustellen, dass awk das Argument als eine Zahl behandelt
Thorbjørn Ravn Andersen

5

Ziemlich trivial mit nur awk. Angenommen, die Beispieldaten befinden sich in einer Datei ex.txt:

$ awk '{total = total + int($3)}END{print "Total Amount collected = "total}' ex.txt

Beispiel

$ awk '{total = total + $3}END{print "Total Amount collected = "total}' ex.txt 
Total Amount collected = 95657

Einzelheiten

Mit awksammeln wir die Werte aus der 3. Spalte ( $3) und akkumulieren ihre Zwischensumme in der Variablen total. Sobald dies abgeschlossen ist, END{..}drucken wir als letztes die Nachricht zusammen mit dem Wert der Variablen total.


int($3)
Nehmen Sie

1
Das kleine int($3)bekommt die Dinge so, wie ich es brauche.
bballdave025

2
total=0; 
for n in  $( tail -n +4 /tmp/reports.txt | awk '{print $3}') ; 
do 
   total=$( expr $total + $n ); 
done ; 
echo ">>$total" 

1
Sie können den Wert einer Variablen in einer solchen Schleife nicht ändern. Siehe meine Antwort hier für eine Möglichkeit, Variablen außerhalb ihrer Schleife zugänglich zu machen.s
terdon

2

Der awkAnsatz ist wahrscheinlich der einfachste. Hier sind einige andere Möglichkeiten:

Perl:

perl -lane '$k+=$F[2];END{print $k}' foo.txt

Reine Coreutils:

t=0; tail -n +4 foo.txt | tr -s ' ' '\t' | cut -d $'\t' -f 3 | 
 while read i; do let t+=$i; echo $t; done  | tail -n 1

2

Wenn es helfen kann:

grep -Eo '[0-9\.]+' your_file|tr '\n' '+'|sed 's/\+$//'|bc -l

0

Diese Pipeline sollte die Arbeit erledigen:

tail -n +4 the_file | awk '{ sum += $3 } END { printf "Total Amount collected = %d\n", sum }'

-1
awk '{FS=","}{s+=$6}END{print s}' Filename

1
Kannst du es erklären?
Prvt_Yadav

1
Willkommen bei U & L, dies fügt der akzeptierten Antwort und anderen kaum etwas hinzu, außerdem sehe ich die Verwendung von FS nicht.
Archemar

Wie funktioniert das, da die Beispieleingabe keine Kommas enthält?
Jeff Schaller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.