Skip to main content

Com escriure comandes i scripts AWK

Anonim

La comanda awk és un mètode potent per processar o analitzar fitxers de text, en particular, fitxers de dades organitzats per línies (files) i columnes.

Simple awk Les comandes es poden executar des de la línia d'ordres. Les tasques més complexes s'han d'escriure com a programes awk (anomenats scripts awk) en un fitxer.

El format bàsic d'una ordre awk es veu així:

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

Això significa: prendre cada línia del fitxer d'entrada; si la línia conté el patró, apliqueu l'acció a la línia i escriviu la línia resultant al fitxer de sortida. Si s'omet el patró, l'acció s'aplica a tota la línia. Per exemple:

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

Aquesta afirmació pren l'element de la cinquena columna de cada línia i l'escriu com una línia al fitxer de sortida "output.txt". La variable '$ 4' fa referència a la segona columna. De la mateixa manera, podeu accedir a la primera, segona i tercera columna, amb $ 1, $ 2, $ 3, etc. De manera predeterminada, les columnes s'assumeixen que estan separades per espais o pestanyes (anomenades espais en blanc). Per tant, si el fitxer d'entrada "table1.txt" conté aquestes línies:

1, Justin Timberlake, Títol 545, Preu 7,30 dòlars2, Taylor Swift, títol 723, preu 7,90 dòlars3, Mick Jagger, títol 610, Preu 7,90 dòlars4, Lady Gaga, títol 118, preu 7,30 dòlars5, Johnny Cash, títol 482, preu de $ 6.506, Elvis Presley, títol 335, preu 7,30 dòlars7, John Lennon, Títol 271, Preu $ 7,908, Michael Jackson, títol 373, preu 5,50 dòlars

Llavors, l'ordre escriuria les següents línies al fitxer de sortida "output1.txt":

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

Si el separador de columna és una altra cosa que espais o pestanyes, com ara una coma, podeu especificar-lo a la declaració awk de la següent manera:

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

Això seleccionarà l'element de la columna 3 de cada línia si les columnes es consideren separades per una coma. Per tant, la sortida, en aquest cas, seria:

Títol 545 Títol 723 Títol 610 Títol 118 Títol 482 Títol 335 Títol 271 Títol 373

La llista de declaracions dins dels claudàtors ('{', '}') s'anomena bloc. Si posa una expressió condicional davant d'un bloc, la instrucció dins del bloc s'executarà només si la condició és certa.

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

En aquest cas, la condició és de $ 7 == " $ 7,30", el que significa que l'element de la columna 7 és igual a $ 7,30. La barra invertida davant del signe de dòlar s'utilitza per evitar que el sistema interpreti $ 7 com a variable i, en canvi, porteu el signe del dòlar literalment.

D'aquesta manera, aquesta declaració awk imprimeix l'element a la tercera columna de cada línia que té un valor de "$ 7.30" a la columna 7.

També podeu utilitzar expressions regulars com a condició. Per exemple:

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

La cadena entre les dues barres ('/') és l'expressió regular. En aquest cas, és només la cadena "30." Això significa que si una línia conté la cadena "30", el sistema imprimeix l'element a la tercera columna d'aquesta línia. La sortida de l'exemple anterior seria:

Timberlake, Gaga, Presley,

Si els elements de la taula són números, awk pot executar càlculs sobre ells com en aquest exemple:

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

A més de les variables que accedeixen a elements de la fila actual ($ 1, $ 2, etc.), hi ha la variable $ 0 que fa referència a la fila completa (línia) i a la variable NF que conté el nombre de camps.

També podeu definir noves variables com en aquest exemple:

awk '{sum = 0; per (col = 1; col <= NF; col + +) suma + = $ col; imprimir sum; } '

Això calcula i imprimeix la suma de tots els elements de cada fila.

Les expressions Awk es combinen freqüentment amb comandaments sed.