Pregunta

Quiero la parte superior de salida 10 líneas de comando AWK en la lista de ficheros dados por el hallazgo, utilizando este fragmento:

$ find . -name "*.txt" -print -exec awk '$9 != ""'  \| head -n10 {} \;

Tenga en cuenta también que quiero imprimir los nombres de los archivos que se procesan.

Pero por qué me sale ese error:

awk: cmd. line:2: fatal: cannot open file `|' for reading (No such file or directory)
./myfile.txt

¿Cuál es la forma correcta de hacerlo?

He intentado sin barra invertida antes de la tubería. Aún así, dio un error:

find: missing argument to `-exec'
head: cannot open `{}' for reading: No such file or directory
head: cannot open `;' for reading: No such file or directory
¿Fue útil?

Solución

Si desea ejecutar un programa awk en cada archivo desde encuentran que sólo imprime las primeras 10 líneas cada vez .

$ find . -name "*.txt" -print -exec awk '$9 != "" && n < 10 {print; n++}' {} \;

Otros consejos

Cuando se ejecuta un comando con -exec del hallazgo, no consigue todas las cosas shell agradables como el operador de canalización (|). Se puede recuperar mediante la ejecución de un subnivel de forma explícita si lo desea, sin embargo, por ejemplo:

encontrar. -name '* .txt' -exec / bin / sh -c "echo un archivo de texto llamado {} | cabeza -n 15" \;

Sobre la base de la respuesta de Ashawley:

find . -name "*.txt" -print -exec awk '$9 != "" {print; if(NR > 9) exit; }' {} \;

Debe realizar mejor, ya que salir de AWK después del 10 de grabación.

El uso de awk sólo debe trabajar:

find . -name "*.txt" -print -exec awk '{if($9!=""&&n<11){print;n++}}' {} \;

Puede hacerlo de esta manera también:

find . -name '*txt' -print -exec awk 'BEGIN {nl=1 ;print FILENAME} $9 !="" {if (nl<11) { print $0 ; nl = nl + 1 }}' {}  \;

sin head.

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