¿Estás usando awk para recorrer la lista de archivos?

No estoy familiarizado con awk, pero estoy buscando una forma de iterar a través de todos los archivos en un directorio y ejecutar un simple awk mando. Mi comando es una sustitución simple que reemplaza todas las pestañas con dos espacios.

awk '{gsub("\t","  ");print}'

¿Cómo se puede extender esto para recorrer un directorio y ejecutar el comando en todos los archivos?

preguntado el 27 de agosto de 11 a las 14:08

5 Respuestas

Pasar los archivos a awk en la línea de comando, por supuesto: `

$ awk 'program' *

Pero probablemente sea más fácil de usar

$ perl -pe 's/\t/  /g' *

O, si prefiere tener una edición en el lugar, simplemente:

$ perl -i.orig -pe 's/\t/  /g' *

Respondido 27 ago 11, 19:08

¿Sabes si se puede usar Perl para unir otra sustitución? awk '{gsub("\t"," ");print}' | sed "s/foo/bar/g"? Si es así, Perl podría ser la mejor solución como usted dijo. - drbunsen

@ dr.bunsen: Sí, por supuesto, solo separe los comandos con un punto y coma: perl -pe 's/\t/ /g; s/foo/bar/g' - tchrist

¡gracias! Creo que empezaré a intentar aprender perl, ¡estos comandos son realmente convenientes como una sola línea! - drbunsen

una versión mejorada de la idea de Heisenbug

find . -type f -exec awk '{gsub("\t"," ");print}' {} \;

evita llamar a otro programa como xargs. Parece ser un poco más rápido con algunas pruebas que hice.

Respondido 11 Abr '13, 20:04

use buscar y redirija la salida a awk:

find . -type f | xargs awk '{gsub("\t"," ");print}'

Respondido 27 ago 11, 19:08

Eso mira los nombres de los archivos, no el contenido de los archivos. - tchrist

puedes hacerlo con uno awk comando

awk -F"\t" '{$1=$1;print $0 >FILENAME}' OFS=" " file

Respondido 28 ago 11, 05:08

Un fragmento útil, que muestra awk procesando una lista de archivos como si fuera una secuencia (observe cómo se usa el número de línea)

find $HOME/.ssh -name "*.pub" -type f \
  -exec awk '{printf "%c) %12s %s...%s %s\n", 64 + NR, $1, substr($2,1,7), substr($2,length($2)-7), $3}' \
  {} +

salida de ejemplo

A)      ssh-dss AAAAB3N...WhdJHA== bob@your.uncle
B)  ssh-ed25519 AAAAC3N...9a5kCpbT bob@your.uncle
C)      ssh-rsa AAAAB3N...fzh3oUGZ bob@your.uncle

respondido 26 nov., 19:16

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.