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.