Kā uzrakstīt AWK komandas un skriptus

Komandas, sintakse un piemēri

AWK komanda ir spēcīga metode teksta failu apstrādei vai analīzei, it īpaši datu failiem, kurus organizē līnijas (rindas) un kolonnas.

Vienkāršas awk komandas var palaist no komandrindas . Sarežģītāki uzdevumi jāraksta kā awk programmas (tā sauktie awk skripti) failā.

AVK komandas pamatformāts izskatās šādi:

awk 'modelis {action}' input-file 'izejas fails

Tas nozīmē: ņemt katru ievades faila rindu; ja rindā ir modelis, tiek piemērota darbība līnijai un uzrādīt iegūto rindu izejas failam. Ja modelis tiek izlaists, darbība tiek piemērota visām līnijām. Piemēram:

awk '{print $ 5}' table1.txt> output1.txt

Šis paziņojums ņem vērā katras rindiņas 5. kolonnas elementu un raksta to kā izejas faila "output.txt" rindiņu. Mainīgais lielums "4 $" attiecas uz otro sleju. Tāpat varat piekļūt pirmajai, otrajai un trešai kolonnai ar $ 1, $ 2, $ 3 utt. Pēc noklusējuma tiek uzskatīts, ka kolonnas ir atdalītas ar atstarpēm vai cilnēm (tā saukto atstarpi). Tātad, ja ievades fails "table1.txt" satur šīs rindas:

1, Justin Timberlake, sadaļa 545, cena 7,30 $ 2, Taylor Swift, sadaļa 723, cena 7,90 $ 3, Mick Jagger, sadaļa 610, cena 7,90 $ 4, Lady Gaga, sadaļa 118, cena 7,30 $ 5, Johnny Cash, virsraksts 482, cena 6,50 $ 6, Elviss Preslijs, sadaļa 335, cena 7,30 $ 7, John Lennon, sadaļa 271, cena 7,90 $ 8, Michael Jackson, sadaļa 373, cena 5,50 $

Pēc tam komanda uz izejas faila "output1.txt" uzraksta šādas rindiņas:

545, 723, 610, 118, 482, 335, 271, 373,

Ja kolonnu atdalītājs ir kaut kas cits, nevis atstarpes vai cilnes, piemēram, komatu, jūs varat norādīt, ka paziņojumā awk ir norādīts šādi:

awk -F, '{print $ 3}' table1.txt> output1.txt

Tas atlasīs elementu no katras rindiņas 3 kolonnas, ja kolonnas tiek uzskatītas par atdalāmām ar komatu. Tādēļ produkcija šajā gadījumā būtu:

Sadaļa 545 Sadaļa 723 Sadaļa 610 Sadaļa 118 Sadaļa 482 Sadaļa 335 Sadaļa 271 Sadaļa 373

Norāžu saraksts cirvijās iekavās ('{', '}') tiek saukts par bloku. Ja jūs izveidojat nosacījuma izteiksmi bloka priekšā, paziņojums iekšpusē blokā tiks izpildīts tikai tad, ja nosacījums ir taisnība.

awk '$ 7 == "\ $ 7,30" (drukāt 3 $) "table1.txt

Šajā gadījumā nosacījums ir 7 $ == "\ $ 7,30", kas nozīmē, ka 7. slejā esošais elements ir vienāds ar 7,30 ASV dolāriem. Pirms dolāra zīmes ir vērsta atpakaļgala slīpsvītra, lai sistēma netiktu interpretējusi $ 7 kā mainīgo lielumu un tā vietā ņemtu dolāru zīmi burtiski.

Tātad šis awk paziņojums izdrukā elementu katras rindas trešajā ailē, kurai 7. slejā ir "7,30 $".

Jūs varat arī izmantot regulāras izteiksmes kā nosacījumu. Piemēram:

awk '/ 30 / {print $ 3}' table1.txt

Stringa starp abām slīpsvītrām ('/') ir regulārā izteiksme. Šajā gadījumā tas ir tikai virkne "30." Tas nozīmē, ka, ja rindā ir virkne "30", sistēma izdrukā elementu šīs līnijas trešajā kolonnā. Iepriekš minētajā piemērā produkcija būtu:

Timberlake, Gaga, Presley,

Ja tabulas elementi ir skaitļi awk, tie var veikt aprēķinus, kā šajā piemērā:

awk '{print ($ 2 * $ 3) + $ 7}'

Papildus mainīgajiem lielumiem, kas piekļūst pašreizējās rindas elementiem ($ 1, $ 2 utt.), Ir mainīgais $ 0, kas attiecas uz visu rindu (līniju) un NF mainīgo, kas atrodas lauku skaitam.

Varat arī definēt jaunus mainīgos, kā šajā piemērā.

awk '(summa = 0; par (col = 1; col <= NF; col ++) sum + = $ col; drukas summa; } '

Tas aprēķina un izdrukā visu elementu skaitu katrā rindā.

Awk izteicieni bieži apvieno ar sed komandām .