Frage

Ich mag folgenden „awk“ Befehl auf Dateien mit der Endung „* .txt“

anzuwenden
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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top