¿Es una buena idea filtrar la entrada antes de ejecutar la acción awk?

¿Es una buena idea filtrar la entrada antes de ejecutar la acción awk?

Si tengo alguna entrada, ¿es mejor filtrar los datos antes de ejecutar mi awkacción o debería hacer todo el filtrado awk?

Por ejemplo, dada la siguiente entrada:

$ echo "foo\nbar\nbaz"
foo
bar
baz

¿Debo ejecutar:

$ echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }'
foo cats

O:

$ echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }'
foo cats
  • ¿Por qué debería ejecutar cualquiera de los dos?
  • ¿Debería utilizar una herramienta diferente?
  • ¿Qué factores debería considerar?
  • ¿Cómo puedo probar esos factores?

Respuesta1

En este caso concreto, la segunda opción es la mejor.

En general, es más eficiente minimizar la cantidad de servicios públicos en una tubería. Es mejor no bifurcar (iniciar) procesos innecesarios (como en el primer ejemplo con un sedproceso innecesario). En Internet no es difícil encontrar ejemplos de quejas sobreusos inútiles del gato.

Con la mayoría de los sistemas modernos tipo Unix * , la bifurcación se lleva a cabo de manera bastante eficiente, pero depende del tamaño del proceso que se inicia; por ejemplo, el lanzamiento perlde o pythonsería mucho más lento que sedo awk.

Para comandos únicos, esto no importa demasiado, pero si su canalización estaba dentro de un bucle y se ejecutaba muchas veces, eliminar procesos innecesarios de su canalización podría acelerar drásticamente el tiempo total de ejecución.

Preguntás especificas

¿Por qué debería ejecutar cualquiera de los dos?

Si está más familiarizado con la sintaxis de uno que con el otro, podría ser mejor para la legibilidad (y el mantenimiento) del código utilizar la herramienta/lenguaje con el que esté más familiarizado.

¿Debería utilizar una herramienta diferente?

En este caso concreto, no lo creo. Ambos awky sedson herramientas apropiadas para este tipo de trabajo.

¿Qué factores debería considerar?

Si tiene que procesar varios archivos (por ejemplo, en un bucle), entonces la velocidad/eficiencia sería importante.

Si solo está procesando un archivo grande, de vez en cuando, la legibilidad del código puede ser más importante.

¿Cómo puedo probar esos factores?

Puede crear perfiles de diferentes versiones utilizando la timeutilidad, disponible como shell integrado en Bash, pero también como un programa ejecutable independiente. Por ejemplo, ejecutar los dos comandos de ejemplo muestra que el primer ejemplo tardó 0,012 segundos más que el segundo.

$ time echo "foo\nbar\nbaz" | sed 1q | awk '{ print $0 " cats" }'
foo\nbar\nbaz cats

real    0m0.056s
user    0m0.000s
sys     0m0.045s

$ time echo "foo\nbar\nbaz" | awk 'NR == 1 { print $0 " cats" }'
foo\nbar\nbaz cats

real    0m0.044s
user    0m0.000s
sys     0m0.031s

Tenga en cuenta que los puntos de referencia de creación de perfiles se ven afectados por la carga del sistema y otros factores limitantes, por lo que deberá repetir esto una gran cantidad de veces para obtener una imagen real de qué versión es más rápida que la otra.


* Con MS Windows, bifurcandoesmás costoso, por lo que minimizar la cantidad de procesos que se inician marca la diferencia cuando se ejecuta en entornos como Cygwin.

Respuesta2

es suficiente para usarawk(osed) herramienta para casos tan simples. Una combinación de múltiples herramientas sería demasiado complicada y, a menudo, redundante:

echo -e "foo\nbar\nbaz" | awk 'NR==1{print $0" cats"}'

La salida:

foo cats

¿Qué factores debería considerar?

Asegúrese de que el procesamiento de texto necesario requiera una combinación de varias herramientas diferentes; de lo contrario, utilice el poder de una herramienta distinta.

Digamos que si solo necesito agregar una determinada palabra antes de la primera palabra en la cadena de entrada, también es fácil consedherramienta:

echo -e "foo\nbar\nbaz" | sed 's/^.*$/& cats/; 1q'
foo cats

echo -e, ebandera "habilita la interpretación de escapes de barra invertida"


De todos modos, depende de qué tan complejo sea el texto de entrada y qué tan sofisticadas sean sus reglas de procesamiento de texto.

información relacionada