Seuraavan komennon käyttäminen Awkin kanssa Linuxissa - Osa 6
Tässä Awk-sarjan kuudennessa osassa tarkastelemme next
-komentoa, joka käskee Awk ohittamaan kaikki muut antamasi mallit ja lausekkeet, mutta lukemaan sen sijaan seuraavan. syöttölinja.
next
-komento auttaa sinua estämään komennon suorittamisen aikana kutsuttujen aikaa vievien vaiheiden suorittamisen.
Ymmärtääksemme, miten se toimii, harkitsemme tiedostoa nimeltä food_list.txt, joka näyttää tältä:
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
Harkitse seuraavan komennon suorittamista, joka merkitsee ruoat, joiden määrä on pienempi tai yhtä suuri kuin 20, (*)
-merkillä jokaisen rivin lopussa:
# 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
Yllä oleva komento toimii itse asiassa seuraavasti:
- Ensin se tarkistaa, onko kunkin syöttörivin määrä, neljäs kenttä pienempi tai yhtä suuri kuin 20. Jos arvo täyttää tämän ehdon, se tulostetaan ja merkitään
(*)
. merkki lopussa käyttäen lauseketta yksi:$4 <= 20
- Toiseksi se tarkistaa, onko kunkin syöttörivin neljäs kenttä suurempi kuin 20, ja jos rivi täyttää ehdon, se tulostetaan lausekkeella kaksi:
$4 > 20
Mutta tässä on yksi ongelma: kun ensimmäinen lauseke suoritetaan, rivi, jonka haluamme merkitä, tulostetaan käyttämällä: { printf "%s\t%s\n", $0, "**" ; }
ja sitten samassa vaiheessa tarkistetaan myös toinen lauseke, josta tulee aikaa hukkaava tekijä.
Joten ei tarvitse suorittaa toista lauseketta, $4 > 20
uudelleen, kun olet tulostanut jo merkittyjä rivejä, jotka on tulostettu käyttämällä ensimmäistä lauseketta.
Tämän ongelman ratkaisemiseksi sinun on käytettävä next
-komentoa seuraavasti:
# 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
Kun yksi syöttörivi on tulostettu käyttämällä $4 <= 20
{ printf "%s\t%s\n", $0,"*" ; Seuraava ; }
, mukana oleva next
-komento auttaa ohittamaan toisen lausekkeen $4 > 20
{ print $0 ;}
, joten suoritus menee seuraavalle syöttöriville ilman, että sinun tarvitsee tuhlata aikaa tarkistaaksesi, onko määrä suurempi kuin 20.
Next-komento on erittäin tärkeä, sillä se kirjoittaa tehokkaita komentoja, ja tarvittaessa voit aina nopeuttaa komentosarjan suorittamista. Valmistaudu sarjan seuraavaan osaan, jossa tarkastellaan vakiosyötteen (STDIN) käyttöä Awk-syötteenä.
Toivottavasti tämä opastus auttaa sinua ja voit aina kirjoittaa ajatuksesi kirjallisesti jättämällä kommentin alla olevaan kommenttiosaan.