Búsqueda de sitios web

Cómo usar el comando 'siguiente' con Awk en Linux - Parte 6


En esta sexta parte de la serie Awk, veremos el uso del comando next, que le dice a Awk que omita todos los patrones y expresiones restantes que haya proporcionado, pero en su lugar lea el siguiente. línea de entrada.

El comando next le ayuda a evitar ejecutar lo que yo llamaría pasos que hacen perder tiempo en la ejecución de un comando.

Para entender cómo funciona, consideremos un archivo llamado food_list.txt que se ve así:

No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

Considere ejecutar el siguiente comando que marcará los alimentos cuya cantidad sea menor o igual a 20 con un signo (*) al final de cada línea:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

El comando anterior en realidad funciona de la siguiente manera:

  1. Primero, verifica si la cantidad, cuarto campo de cada línea de entrada, es menor o igual a 20, si un valor cumple con esa condición, se imprime y se marca con el (*) firma al final usando la expresión uno: $4 <= 20
  2. En segundo lugar, verifica si el cuarto campo de cada línea de entrada es mayor que 20, y si una línea cumple con la condición, se imprime usando la expresión dos: $4 > 20

Pero aquí hay un problema, cuando se ejecuta la primera expresión, se imprime una línea que queremos marcar usando: { printf "%s\t%s\n", $0, "**"; } y luego, en el mismo paso, también se verifica la segunda expresión, lo que se convierte en un factor de pérdida de tiempo.

Por lo tanto, no es necesario ejecutar la segunda expresión, $4 > 20 nuevamente después de imprimir las líneas ya marcadas que se imprimieron usando la primera expresión.

Para solucionar este problema, debe utilizar el comando next de la siguiente manera:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

Después de imprimir una sola línea de entrada usando $4 <= 20 { printf "%s\t%s\n", $0,"*" ; próximo ; }, el comando next incluido ayudará a omitir la segunda expresión $4 > 20 { print $0 ;}, por lo que la ejecución va a la siguiente línea de entrada sin tener que perder tiempo comprobando si la cantidad es mayor que 20.

El comando siguiente es muy importante para escribir comandos eficientes y, cuando sea necesario, siempre se puede utilizar para acelerar la ejecución de un script. Prepárese para la siguiente parte de la serie donde veremos el uso de la entrada estándar (STDIN) como entrada para Awk.

Espero que esta guía le resulte útil y, como siempre, pueda expresar sus opiniones por escrito dejando un comentario en la sección de comentarios a continuación.