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
RAM
quelle

Antworten:

14
awk '{s+=$3}END{print s}' yourfile
Kaffeetasse
quelle
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.

slm
quelle
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" 
jose
quelle
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
terdon
quelle
2

Wenn es helfen kann:

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

Diese Pipeline sollte die Arbeit erledigen:

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

quelle
-1
awk '{FS=","}{s+=$6}END{print s}' Filename
Madhu K.
quelle
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