2016-05-04 14 views
1

Ich möchte alle 3. Felder aus jeder Zeile hinzufügen und das Ergebnis erzeugen.Wie fügt man alle Werte in einer bestimmten Spalte hinzu?

Unten ist die Art, wie ich das Problem gelöst

sum=0 
grep '2016Feb' input.txt|awk -F\- '{print $3}'|while read LINE; do 
sum = $(expr $sum + $LINE) 
done 
echo $sum 

Gibt es einen besseren Weg, das Problem als meinen Code zu lösen? Möglich ein Befehl, der das Problem @ Befehlszeile selbst löst?

Für eine Datei wie:

$ cat input.txt 
Feb2016-2016-110 
Feb2016-2016-20 
Feb2016-2016-220 
Feb2016-2016-140 
Feb2016-2016-100 

Die Ausgabe lautet: 590.

+0

ich bezweifle, dass dies funktioniert, da 'Summe =' $ (expr $ sum + $ LINE) ist keine gültige Syntax. Leerzeichen um '=' sollten entfernt werden. – fedorqui

+0

Vereinbarte Fedorqui. Der obige Code wurde nicht implementiert. Aber die Logik und die Art und Weise, wie es gelöst wird, ist definitiv korrekt, wobei Syntaxkorrekturen ausgelassen werden. – user3624000

Antwort

2

Einfach die Feldtrenner auf den Strich und die Summe die dritte Säule:

$ awk -F- '{sum+=$3} END{print sum+0}' file 
590        ^^ 
#      in case there are no matching lines, print 0 

Da es so aussieht, Sie gerade diese Zeilen zu zählen, die den Text „Feb2016“ enthalten, können Sie auch einen Filter hinzufügen:

awk -F- '/Feb2016/{sum+=$3} END{print sum+0}' file 
#  ^^^^^^^^^ 
#  just on lines containing the string "Feb2016" 
+1

Dies ist effektiv. Danke, Fedorqui. – user3624000

1
$ cat data 
Feb2016-2016-110 
Feb2016-2016-20 
Feb2016-2016-220 
Feb2016-2016-140 
Feb2016-2016-100 
$ cut -d - -f 3 data | paste -s -d '+' | bc 
590 
$ 
+0

warum Rohrleitungen so viel, wenn awk allein damit umgehen kann? – fedorqui

+1

@fedorqui ja wahr, oben Pipeline spawns 3 Prozesse; Ich war dabei, die 'awk' Version zu posten, aber du hast mich um einige Sekunden geschlagen ... also habe gerade eine andere Version gepostet – ritesht93

+0

In diesem Fall wäre 'cut' leichter. –

Verwandte Themen