Πώς να γράψετε εντολές και σενάρια AWK

Η εντολή awk είναι μια ισχυρή μέθοδος για την επεξεργασία ή την ανάλυση αρχείων κειμένου. Συγκεκριμένα, αναλύει αρχεία δεδομένων που είναι οργανωμένα ανά γραμμές (γραμμές) και στήλες. Απλές εντολές awk μπορούν να εκτελεστούν από το γραμμή εντολών. Οι πιο σύνθετες εργασίες θα πρέπει να γράφονται ως προγράμματα awk (που ονομάζονται σενάρια awk) σε ένα αρχείο.

Γραφίστας που εργάζεται μέχρι αργά στον υπολογιστή στο γραφείο
Εικόνες Ηρώων / Getty Images

Βασικά στοιχεία AWK

Η βασική μορφή μιας εντολής awk μοιάζει με αυτό:

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

Αυτό σημαίνει: πάρτε κάθε γραμμή του αρχείου εισόδου. εάν η γραμμή περιέχει το μοτίβο, εφαρμόστε την ενέργεια στη γραμμή και γράψτε τη γραμμή που προκύπτει στο αρχείο εξόδου. Εάν το μοτίβο παραλειφθεί, η ενέργεια εφαρμόζεται σε όλες τις γραμμές. Για παράδειγμα:

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

Η παραπάνω πρόταση παίρνει το στοιχείο της 5ης στήλης κάθε γραμμής και το γράφει ως γραμμή στο αρχείο εξόδου "output.txt". Η μεταβλητή '$4' αναφέρεται στην τέταρτη στήλη. Ομοίως, μπορείτε να αποκτήσετε πρόσβαση στην πρώτη, δεύτερη και τρίτη στήλη, με $1, $2, $3 κ.λπ. Από προεπιλογή, οι στήλες υποτίθεται ότι χωρίζονται με κενά ή καρτέλες (το λεγόμενο λευκό διάστημα). Έτσι, εάν το αρχείο εισόδου "table1.txt" περιέχει αυτές τις γραμμές:

1, Justin Timberlake, Τίτλος 545, Τιμή 7,30 $
2, Taylor Swift, Τίτλος 723, Τιμή 7,90 $
3, Mick Jagger, Τίτλος 610, Τιμή 7,90 $
4, Lady Gaga, Τίτλος 118, Τιμή 7,30 $
5, Johnny Cash, Τίτλος 482, Τιμή 6,50 $
6, Elvis Presley, Τίτλος 335, Τιμή 7,30 $
7, John Lennon, Τίτλος 271, Τιμή 7,90 $
8, Michael Jackson, Τίτλος 373, Τιμή 5,50 $

Στη συνέχεια, η εντολή θα έγραφε τις ακόλουθες γραμμές στο αρχείο εξόδου "output1.txt":

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

Εάν το διαχωριστικό στηλών είναι κάτι διαφορετικό από κενά ή καρτέλες, όπως κόμμα, μπορείτε να το καθορίσετε στη δήλωση awk ως εξής:

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

Αυτό θα επιλέξει το στοιχείο από τη στήλη 3 κάθε γραμμής, εάν οι στήλες θεωρούνται ότι χωρίζονται με κόμμα. Επομένως, η έξοδος, σε αυτήν την περίπτωση, θα ήταν:

Τίτλος 545
Τίτλος 723
Τίτλος 610
Τίτλος 118
Τίτλος 482
Τίτλος 335
Τίτλος 271
Τίτλος 373

Εκφράσεις υπό όρους σε AWK

Η λίστα των δηλώσεων μέσα στις αγκύλες ('{','}') ονομάζεται μπλοκ. Αν βάλεις ένα έκφραση υπό όρους μπροστά από ένα μπλοκ, η πρόταση μέσα στο μπλοκ θα εκτελεστεί μόνο εάν η συνθήκη είναι αληθής.

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

Σε αυτήν την περίπτωση, η συνθήκη είναι $7=="\$7,30", που σημαίνει ότι το στοιχείο στη στήλη 7 είναι ίσο με 7,30 $. Η ανάστροφη κάθετο μπροστά από το σύμβολο του δολαρίου χρησιμοποιείται για να εμποδίσει το σύστημα να ερμηνεύσει το $7 ως μεταβλητή και αντ' αυτού να λάβει το σύμβολο του δολαρίου κυριολεκτικά.

Έτσι, αυτή η δήλωση awk εκτυπώνει το στοιχείο στην 3η στήλη κάθε γραμμής που έχει "7,30$" στη στήλη 7.

Μπορείτε επίσης να χρησιμοποιήσετε κανονικές εκφράσεις ως συνθήκη. Για παράδειγμα:

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

Η συμβολοσειρά ανάμεσα στις δύο κάθετες ('/') είναι η κανονική έκφραση. Σε αυτήν την περίπτωση, είναι μόνο η συμβολοσειρά "30". Αυτό σημαίνει ότι εάν μια γραμμή περιέχει τη συμβολοσειρά "30", το σύστημα εκτυπώνει το στοιχείο στην 3η στήλη αυτής της γραμμής. ο παραγωγή στο παραπάνω παράδειγμα θα ήταν:

Timberlake,
Ξεμωραμένος,
Πρίσλεϋ,

Εκτελέστε υπολογισμούς σε AWK

Εάν τα στοιχεία του πίνακα είναι αριθμοί, το awk μπορεί να εκτελέσει υπολογισμούς σε αυτά, όπως σε αυτό το παράδειγμα:

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

Εκτός από τις μεταβλητές που έχουν πρόσβαση σε στοιχεία της τρέχουσας σειράς ($1, $2, κ.λπ.), υπάρχει η μεταβλητή $0 που αναφέρεται στην πλήρη σειρά (γραμμή) και η μεταβλητή NF που ισχύει για τον αριθμό των πεδίων.

Μπορείτε επίσης να ορίσετε νέες μεταβλητές όπως σε αυτό το παράδειγμα:

awk '{ sum=0; για (col=1; col<=NF; col++) άθροισμα += $col; άθροισμα εκτύπωσης? }'

Αυτό υπολογίζει και εκτυπώνει το άθροισμα όλων των στοιχείων κάθε σειράς.

Οι εντολές Awk συχνά συνδυάζονται με εντολές sed.