2009-03-09 10 views
0

ich folgenden „awk“ Befehl auf Dateien mit der Erweiterung anwenden möge „* .txt“mit derselben Erweiterung

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' 

Aber warum dieser Befehl nicht funktioniert:

for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done 

Normalerweise

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt 

funktionieren würde.

Antwort

3

Sobald Sie das Echo entfernt haben sollte es funktionieren:

for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done 

Es wird fehlschlagen, wenn es irgendwelche Textdateien mit Leerzeichen in ihnen sind, könnten Sie dies versuchen:

find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' 

Eine Alternative für Namen Ausdrucken:

find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \; 

(Grundsätzlich make finden Sie awk direkt ausführen, so und auch die Dateinamen ausdrucken. Dadurch werden die Namen der bearbeiteten Dateien zusammen mit dem Ausgang des awk Befehl drucken

+0

Vielen Dank. Gibt es eine Möglichkeit, den Dateinamen auch auszudrucken? – neversaint

0

Nicht sicher, ob Sie kopieren eingefügt haben, oder es ist ein Tippfehler.

für i in * .txt do echo awk '$ 4 ~/NM/{Summe + = $ 2} ENDE {Drucksumme}' $ i; done

Mit Echo korrigiert, wird der obige Befehl Ihr awk-Skript und den Dateinamen wiedergeben, aber nicht ausführen.

1

Echo ist nicht erforderlich.

versuchen

für i in * .txt; machen; awk '$ 4 ~/NM/{Summe + = $ 2} ENDE {Drucksumme}' $ i;

oder

for i in * .txt getan; mache awk $ 4 ~/NM/{sum + = $ 2} END {Drucksumme} '$ i; getan

funktionieren sollte

3
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done 

.

+0

"für i in *. Txt" ist ein schlechter Stil. Funktioniert nicht mit Leerzeichen. – porges

+0

In 'Bash' funktioniert 'for i in * .txt' auch korrekt mit Leerzeichen ($ i enthält den gesamten Dateinamen mit Leerzeichen), aber Sie haben richtigerweise ein Problem, wenn Sie $ i als Argument an awk übergeben. Ich habe jetzt die benötigten Zitate um $ i hinzugefügt, danke. –

2

Versuchen Sie, diese (verwenden nawk oder /usr/xpg4/bin/awk auf Solaris):

awk 'END { 
    printf "%s: %.2f\n", fn, sum 
    } 
FNR == 1 { 
    if (fn) printf "%s: %.2f\n", fn, sum 
    fn = FILENAME 
    sum = 0 
    } 
$4 ~ /NM/ { 
    sum += $2 
    }' *.txt 
2

Sie müssen hinzufügen ';' :

for i in *.txt; do ... 

statt

for i in *.txt do ...