2009-05-10 3 views
1

ich habe Inhalte in einer DateiUnix regex für Inhalte in einer Datei

wie

asdfb ... 1 
adfsdf ... 2 
sdfdf .. 3 

ich einen Unix-Befehl schreiben möchte hinzufügen, die 1 + 2 + 3 hinzuzufügen Lage sein sollten, und gibt die Ergebnis als 6

Von dem, was ich weiß, grep und awk wäre praktisch, würden alle Zeiger helfen.

Antwort

4

Ich glaube, das folgende ist, was Sie suchen. Es wird das letzte Feld in jedem Datensatz für die Daten zusammenfassen, die von stdin gelesen werden.

awk '{ sum += $NF } END { print sum }' < file.txt 

Einige Dinge zu beachten:

  1. Mit awk Sie nicht brauchen, Variablen zu deklarieren, werden sie in die Existenz gewollte Werte zu ihnen zuweisen. Die Variable NF ist die Anzahl der Felder im aktuellen Datensatz. Indem wir es mit einem $ vorsetzen, behandeln wir seinen Wert als Variable. Zumindest scheint es so zu funktionieren :)
  2. Der END { } Block ist nur einmal alle Datensätze wurden von den anderen Blöcken verarbeitet.
0

Dies könnte nicht genau das, was Sie suchen, aber ich schrieb einen schnellen Ruby-Skript Ihr Ziel zu erreichen:

#!/usr/bin/env ruby 

total = 0 
while gets 
    total += $1.to_i if $_ =~ /([0-9]+)$/ 
end 
puts total 
1

Ein awk Skript ist alles, was Sie dafür brauchen, da es grep Einrichtungen hat als Teil der Sprache eingebaut.

Lassen Sie uns sagen, dass Ihre tatsächliche Datei besteht aus:

asdfb zz 1 
adfsdf yyy 2 
sdfdf xx 3 

und Sie die dritte Spalte wollen summieren. Sie können:

echo 'asdfb zz 1 
adfsdf yyy 2 
sdfdf xx 3' | awk ' 
    BEGIN {s=0;} 
      {s = s + $3;} 
    END {print s;}' 

Die BEGIN-Klausel vor der Verarbeitung alle Zeilen ausgeführt wird, die END-Klausel nach allen Zeilen verarbeitet.

Die andere Klausel passiert für jede Zeile, aber Sie können weitere Klauseln hinzufügen, um das Verhalten basierend auf allen möglichen Dingen zu ändern (grep -py Dinge).

+1

Es gemacht werden kann, um immer nur die letzte Spalte verwendet von $ 3 bis $ NF Wechsel: echo 'asdfb zz 1 adfsdf yyy 2 sdfdf xx 3' | awk 'BEGIN {s = 0;} {s = s + $ NF;} ENDE {print s;}' –

+0

Ich wollte in einfachen, @Matthew, anstatt das volle Atomwaffenarsenal, das awk ist entfesseln :-) Sie kann ziemlich gut alles damit machen. – paxdiablo

+0

Die BEGIN-Klausel ist nutzlos, da Variablen standardmäßig auf 0 gesetzt werden.Es ist auch nicht notwendig, dies über mehrere Zeilen zu teilen: awk '{s + = $ 3} END {print s}' –

0

Hier ist eine in Perl.

$ cat foo.txt 
asdfb ... 1 
adfsdf ... 2 
sdfdf .. 3 

$ perl -a -n -E '$total += $F[2]; END { say $total }' foo 
6 

Golfed Version:

perl -anE'END{say$n}$n+=$F[2]' foo 
6