Ricerca nel sito web

Come usare il comando 'next' con Awk in Linux - Parte 6


In questa sesta parte della serie Awk, esamineremo l'utilizzo del comando next, che dice a Awk di saltare tutti i restanti modelli ed espressioni che hai fornito, ma di leggere invece il successivo linea di ingresso.

Il comando next ti aiuta a evitare di eseguire quelli che definirei passaggi che fanno perdere tempo nell'esecuzione di un comando.

Per capire come funziona, consideriamo un file chiamato food_list.txt che assomiglia a questo:

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

Prendi in considerazione l'esecuzione del seguente comando che contrassegnerà gli alimenti la cui quantità è inferiore o uguale a 20 con un segno (*) alla fine di ogni riga:

# 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

Il comando sopra in realtà funziona come segue:

  1. Innanzitutto controlla se la quantità, quarto campo di ogni riga di input, è inferiore o uguale a 20, se un valore soddisfa tale condizione, viene stampato e contrassegnato con il (*) firmare alla fine utilizzando l'espressione uno: $4 <= 20
  2. In secondo luogo, controlla se il quarto campo di ciascuna riga di input è maggiore di 20 e se una riga soddisfa la condizione viene stampata utilizzando l'espressione due: $4 > 20

Ma c'è un problema qui, quando viene eseguita la prima espressione, una riga che vogliamo contrassegnare viene stampata utilizzando: { printf "%s\t%s\n", $0, "**"; } e poi nello stesso passaggio viene controllata anche la seconda espressione, il che diventa un fattore di perdita di tempo.

Quindi non è necessario eseguire nuovamente la seconda espressione, $4 > 20 dopo aver stampato le righe già contrassegnate che sono state stampate utilizzando la prima espressione.

Per risolvere questo problema, devi utilizzare il comando next come segue:

# 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

Dopo che una singola riga di input è stata stampata utilizzando $4 <= 20 { printf "%s\t%s\n", $0,"*" ; Prossimo ; }, il comando nex incluso aiuterà a saltare la seconda espressione $4 > 20 { print $0 ;}, quindi l'esecuzione va a la successiva riga di input senza dover perdere tempo a verificare se la quantità è maggiore di 20.

Il comando successivo è molto importante perché scrive comandi efficienti e dove necessario si può sempre utilizzare per velocizzare l'esecuzione di uno script. Preparatevi per la parte successiva della serie in cui esamineremo l'utilizzo dell'input standard (STDIN) come input per Awk.

Spero che questa guida ti sia utile e che tu possa, come sempre, mettere per iscritto i tuoi pensieri lasciando un commento nella sezione commenti qui sotto.