Pregunta

Quiero aplicar lo siguiente " awk " comando en archivos con extensión " *. txt "

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

Pero por qué este comando no funciona:

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

funcionaría.

¿Fue útil?

Solución

Una vez que hayas eliminado el eco, debería funcionar:

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

Fallará si hay algún archivo de texto con espacios en ellos, puedes intentar esto:

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

Una alternativa para imprimir nombres:

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

(Básicamente, haga que find encuentre awk directamente, así también e imprima los nombres de los archivos.

Otros consejos

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

Esto imprimirá los nombres de los archivos procesados ??junto con la salida del comando awk .

Intente esto (use nawk o / usr / xpg4 / bin / awk en 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 

Es necesario agregar un ';' :

for i in *.txt; do ...

en lugar de

for i in *.txt do ...

no se requiere eco.

prueba

para i en * .txt; hacer; awk '$ 4 ~ / NM / {suma + = $ 2} FIN {imprimir suma}' $ i; hecho

o

para i en * .txt; do awk '$ 4 ~ / NM / {suma + = $ 2} FIN {imprimir suma}' $ i; hecho

debería funcionar

No estoy seguro de si has copiado una copia o es un error tipográfico.

para i en * .txt do echo awk '$ 4 ~ / NM / {sum + = $ 2} END {print sum}' $ i; hecho

Con el eco corregido, el comando anterior reflejará su script awk y el nombre de archivo, pero no lo ejecutará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top