Aplicando AWK en un conjunto de archivos con la misma extensión
-
05-07-2019 - |
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.
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á.