Vyhledávání na webu

Jak používat příkaz 'next' s Awk v Linuxu - část 6


V tomto šestém díle série Awk se podíváme na použití příkazu next, který říká Awk, aby vynechal všechny zbývající vzory a výrazy, které jste poskytli, ale místo toho si přečetl další vstupní řádek.

Příkaz next vám pomůže zabránit provádění toho, co bych při provádění příkazu označil za kroky plýtvající časem.

Abychom pochopili, jak to funguje, podívejme se na soubor s názvem food_list.txt, který vypadá takto:

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

Zvažte spuštění následujícího příkazu, který označí potraviny, jejichž množství je menší nebo rovno 20, se znakem (*) na konci každého řádku:

# 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

Výše uvedený příkaz ve skutečnosti funguje následovně:

  1. Nejprve zkontroluje, zda je počet, čtvrté pole každého vstupního řádku menší nebo rovno 20, pokud hodnota splňuje tuto podmínku, vytiskne se a označí příznakem (*) na konci pomocí výrazu jedna: $4 <= 20
  2. Za druhé zkontroluje, zda je čtvrté pole každého vstupního řádku větší než 20, a pokud řádek splňuje podmínku, vytiskne se pomocí výrazu dva: $4 > 20

Ale je tu jeden problém, když se provede první výraz, řádek, který chceme označit, se vytiskne pomocí: { printf "%s\t%s\n", $0, "**" ; } a poté se ve stejném kroku zkontroluje také druhý výraz, což se stává faktorem plýtváním času.

Není tedy potřeba znovu spouštět druhý výraz, $4 > 20 po vytištění již označených řádků, které byly vytištěny pomocí prvního výrazu.

Chcete-li tento problém vyřešit, musíte použít příkaz next takto:

# 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

Po vytištění jednoho vstupního řádku pomocí $4 <= 20 { printf "%s\t%s\n", $0,"*" ; další ; }, zahrnutý příkaz next pomůže přeskočit druhý výraz $4 > 20 { print $0 ;}, takže spuštění půjde do další vstupní řádek, aniž byste museli ztrácet čas kontrolou, zda je množství větší než 20.

Příkaz další je velmi důležitý, je psaní efektivních příkazů a v případě potřeby jej můžete vždy použít k urychlení provádění skriptu. Připravte se na další část seriálu, kde se podíváme na použití standardního vstupu (STDIN) jako vstupu pro Awk.

Doufám, že vám tento návod pomůže a jako vždy můžete napsat své myšlenky tak, že zanecháte komentář v sekci komentářů níže.