Domanda

Voglio applicare il seguente " awk " comando sui file con estensione " *. txt "

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

Ma perché questo comando non funziona:

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

Normalmente,

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

funzionerebbe.

È stato utile?

Soluzione

Dopo aver rimosso l'eco, dovrebbe funzionare:

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

Fallirà se ci sono file di testo con spazi, puoi provare questo:

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

Un'alternativa per stampare i nomi:

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

(Fondamentalmente trova find esegui awk direttamente, quindi stampa anche i nomi dei file.

Altri suggerimenti

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

Questo stamperà i nomi dei file elaborati insieme all'output del comando awk .

Prova questo (usa nawk o / usr / xpg4 / bin / awk su 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 

Devi aggiungere un ';' :

for i in *.txt; do ...

anziché

for i in *.txt do ...

l'eco non è richiesto.

prova

per i in * .txt; fare; awk '$ 4 ~ / NM / {sum + = $ 2} END {print sum}' $ i; fatto

o

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

dovrebbe funzionare

Non sono sicuro se hai copiato o incollato un errore di battitura.

per i in * .txt fare echo awk '$ 4 ~ / NM / {sum + = $ 2} END {print sum}' $ i; fatto

Con l'eco corretto, il comando sopra farà eco al tuo script awk e al nome del file, ma non lo eseguirà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top