Hogyan írjunk AWK-parancsokat és szkripteket

Az awk parancs hatékony módszer a szöveges fájlok feldolgozására vagy elemzésére. Különösen olyan adatfájlokat elemzi, amelyek sorok (sorok) és oszlopok szerint vannak rendezve. Egyszerű awk parancsok futtathatók a parancs sor. Az összetettebb feladatokat awk programként (úgynevezett awk szkriptekként) kell fájlba írni.

Grafikai tervező későn dolgozik a számítógépen az irodában
Hero Images / Getty Images

AWK alapok

Az awk parancs alapvető formátuma így néz ki:

awk 'minta {action}' input-file > output-file

Ez azt jelenti: vegye ki a bemeneti fájl minden sorát; ha a sor tartalmazza a mintát, alkalmazza a műveletet a sorra, és írja be a kapott sort a kimeneti fájlba. Ha a mintát kihagyja, a művelet minden sorra érvényes. Például:

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

A fenti utasítás minden sor 5. oszlopának elemét veszi, és sorként írja be az "output.txt" kimeneti fájlba. A „$4” változó a negyedik oszlopra vonatkozik. Hasonlóképpen elérheti az első, második és harmadik oszlopot, ahol $1, $2, $3 stb. Alapértelmezés szerint az oszlopokat szóközzel vagy tabulátorral (úgynevezett szóközzel) választja el. Tehát, ha a "tábla1.txt" bemeneti fájl tartalmazza a következő sorokat:

1, Justin Timberlake, 545. cím, ára 7,30 USD
2, Taylor Swift, 723. cím, ára 7,90 USD
3, Mick Jagger, 610. cím, ára 7,90 USD
4, Lady Gaga, 118. cím, ára 7,30 dollár
5, Johnny Cash, 482. cím, ára 6,50 USD
6, Elvis Presley, 335. cím, ára 7,30 dollár
7, John Lennon, 271. cím, ára 7,90 USD
8, Michael Jackson, 373. cím, ára 5,50 USD

Ezután a parancs a következő sorokat írja az "output1.txt" kimeneti fájlba:

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

Ha az oszlopelválasztó nem szóközök vagy tabulátorok, például vessző, ezt a következőképpen adhatja meg az awk utasításban:

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

Ez minden sor 3. oszlopából választja ki az elemet, ha az oszlopokat vesszővel elválasztottnak tekinti. Ezért a kimenet ebben az esetben a következő lenne:

545. cím
723. cím
610. cím
118. cím
482. cím
335. cím
271. cím
373. cím

Feltételes kifejezések AWK-ban

A szögletes zárójelben ('{','}') lévő utasítások listáját blokknak nevezzük. Ha a feltételes kifejezés blokk előtt a blokkon belüli utasítás csak akkor kerül végrehajtásra, ha a feltétel igaz.

awk '$7=="\$7.30" { print $3 }' table1.txt

Ebben az esetben a feltétel: $7=="\$7.30", ami azt jelenti, hogy a 7. oszlopban szereplő elem egyenlő 7.30 dollárral. A dollárjel előtti fordított perjel arra szolgál, hogy a rendszer ne értelmezze a 7 dollárt változóként, és ehelyett a dollárjelet szó szerint vegye.

Tehát ez az awk utasítás minden sor 3. oszlopában kiírja azt az elemet, amelynek a 7. oszlopában „7,30 USD” van.

Feltételként reguláris kifejezéseket is használhat. Például:

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

A két perjel közötti karakterlánc ('/') a reguláris kifejezés. Ebben az esetben ez csak a „30” karakterlánc. Ez azt jelenti, hogy ha egy sor a "30" karakterláncot tartalmazza, a rendszer kiírja az elemet a sor 3. oszlopában. Az Kimenet a fenti példában ez lenne:

Timberlake,
Gaga,
Presley,

Hajtsa végre a számításokat AWK-ban

Ha a táblázatelemek számok, akkor az awk számításokat tud rajtuk futtatni, mint ebben a példában:

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

Az aktuális sor elemeit elérő változókon ($1, $2 stb.) kívül van a $0 változó, amely a teljes sorra (sorra) utal, és az NF változó, amely a mezők számát jelöli.

Új változókat is megadhat, mint ebben a példában:

awk '{ összeg=0; for (col=1; col<=NF; col++) összeg += $col; nyomtatási összeg; }'

Ez kiszámítja és kiírja az egyes sorok összes elemének összegét.

Az awk utasításokat gyakran kombinálják sed parancsokkal.