Anwenden von AWK auf Set von Dateien mit dieser Endung
-
05-07-2019 - |
Frage
Ich mag folgenden „awk“ Befehl auf Dateien mit der Endung „* .txt“
anzuwendenawk '$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.
Lösung
Wenn 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 ist, können Sie versuchen, diese:
find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Eine Alternative für Namen auszudrucken:
find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;
(Im Grunde finden machen ausführen awk direkt, so und ausdrucken auch die Dateinamen.
Andere Tipps
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done
Damit werden die Namen der bearbeiteten Dateien zusammen mit dem Ausgang des awk
Befehl drucken.
Versuchen Sie, diese (Verwendung 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
Sie müssen hinzufügen ein ‚;‘ :
for i in *.txt; do ...
statt
for i in *.txt do ...
Echo ist nicht erforderlich.
Versuch
für i in * .txt; machen; awk '$ 4 ~ / NM / {sum + = $ 2} END {print Summe}' $ i; getan
oder
für i in * .txt; tun awk '$ 4 ~ / NM / {sum + = $ 2} END {print Summe}' $ i; getan
sollte funktionieren
Nicht sicher, ob Sie haben Kopie geklebt oder es ist ein Tippfehler.
für i in * .txt do echo awk '$ 4 ~ / NM / {sum + = $ 2} END {print Summe}' $ i; getan
Mit Echo korrigiert, oben der Befehl Ihre awk Skript Echo und den Dateinamen, sondern führen Sie es nicht.