Μια σύντομη εισαγωγή στο awk

Τι είναι το awk

Υπάρχουν κάποια προγράμματα που έχουν αποδειχθεί τόσο σημαντικά και όμως δεν κατάφεραν να αποκτήσουν ένα κανονικό όνομα. Όταν οι Alfred V. Aho, Peter J. Wein-berger, και ο πολύς Brian W. Kernighan έγραψαν το πρώτο awk το ονόμασαν με τα αρχικά τους. Ίσως γιατί δεν υπήρχε τότε κάτι άλλο που να κάνει αυτή την δουλεία. Και σαν πρόγραμμα κάνει κάτι απλό, φιλτράρει κείμενα. Και όμως ολόκληρες γλώσσες προγραμματισμού βγήκαν από αυτό. Αν σήμερα γραφείς σε Perl (αλήθεια;) ή σε Python ή σε Ruby ίσως να μην ξέρεις την ταπεινή τους πρώτη καταγωγή.

Και όμως παρά το ότι είναι τόσο παλιό έχει ακόμα και σήμερα την χρησιμότητα του. Γιατί με μια γραμμή μπορείς να κάνεις πολλά που θα ήθελες 10 γραμμές σε μια άλλη γλώσσα. Κάποιοι δεν το θεωρούν καν γλώσσα προγραμματισμού, αλλά απλά ένα εργαλείο. Το πως θα το χαρακτηρίσεις δεν έχει καμία σημασία. Σήμερα χρησιμοποιούμε το gawk την επαυξημένη “μοντέρνα” έκδοση του από το GNU και μάλλον το έχεις ήδη εγκατεστημένο.

Υπάρχουν τα βιβλία και το βιβλίο του είναι εξαιρετικά καλό, αλλά αντί για θεωρίες ας μιλήσουμε με παραδείγματα. Στο στυλ αυτού του άρθρου. Όπως θα το χρησιμοποιούσε κάποιος που δεν θέλει να διαβάσει πρώτα τις 570(!) σελίδες του βιβλίου του

Κατεβάζοντας ένα αρχείο με δεδομένα

Ας δούμε το awk στην πράξη. Θα χρειαστούμε κάποιο αρχείο με δεδομένα. Ας κατεβάσουμε ένα αρχείο από το δίκτυο, μιας και έξω είναι ηφαίστειο ας δούμε τα ηφαίστεια του κόσμου

wget "https://data.humdata.org/dataset/a60ac839-920d-435a-bf7d-25855602699d/resource/e3b1ecf0-ec47-49f7-9011-6bbb7403ef6d/download/volcano.csv"

head volcano.csv
wc --lines volcano.csv

και το αρχείο μοιάζει κάπως έτσι

 VolcanoID,V_Name,Country,Region,Subregion,Latitude,Longitude,PEI,H_active,VEI_Holoce,hazard,class,risk
 210010,West Eifel Volcanic Field,Germany,Mediterranean and W Asia,Western Europe,50.170000000000000,6.850000000000000,6,0,Unknown VEI,NULL,U-HR,NULL
 210020,Cha?ne des Puys,France,Mediterranean and W Asia,Western Europe,45.774999999999900,2.970000000000000,7,0,Unknown VEI,NULL,U-HR,NULL
 210030,Olot Volcanic Field,Spain,Mediterranean and W Asia,Western      Europe,42.170000000000000,2.530000000000000,5,0,No confirmed eruptions,NULL,U-NHHR,NULL
 210040,Calatrava Volcanic Field,Spain,Mediterranean and W Asia,Western Europe,38.869999999999900,-4.020000000000000,6,0,Unknown VEI,NULL,U-HR,NULL
 211001,Larderello,Italy,Mediterranean and W Asia,Italy,43.250000000000000,10.869999999999900,4,0,3,NULL,U-HR,NULL

Εναλλακτικά μπορείς να ανοίξεις το αρχείο στο libreoffice και να το εξετάσεις.
Η πρώτη γραμμή λέει τι είναι κάθε τι. Έτσι το δεύτερο πεδίο είναι το όνομα του, το τρίτο η χώρα κλπ. Η πληροφορία αυτή είναι σημαντική. Θα την αφήσουμε έτσι για την ώρα, και ας μπλέκετε με τα δεδομένα. Το αρχείο περιέχει πληροφορίες για 1546 ηφαίστεια σε 1547 γραμμές.

Μια πρώτη επαφή

Ας δούμε πως θα πάρουμε τα ονόματα των ηφαιστείων. Μια πρώτη προσπάθεια

awk '{print $2}' volcano.csv

Αυτό που υπάρχει μέσα στα μονά εισαγωγικά είναι το πρόγραμμα του awk. Περισσότερα για την σύνταξη αργότερα, αλλά για την ώρα αρκεί να ξέρουμε ότι δεν δουλεύει :crazy_face:. Τρέξτε το και προσπαθήστε να καταλάβετε τι πήγε στραβά …
Ο λόγος μοιάζει να είναι πως χωρίζει τα πεδία με το κενό, ενώ εμείς θέλουμε με το ,. Κάποιος μας ψιθυρίζει στο αυτή -F "," ή σκέτο -F, και ξαναδοκιμάζουμε.

awk -F, '{print $2}' volcano.csv

Και δούλεψε :nerd_face:, ε δηλαδή σχεδόν. Η αρίθμηση ξεκινάει στους υπολογιστές από το μηδέν αλλά στο awk ξεκινάει από το 1 :exploding_head:.

Μόνος σου τώρα: Τύπωσε την χώρα και μετά τύπωσε την στήλη EI_Holoce

Στο επόμενο βήμα θα βρούμε τα ηφαίστεια που είναι αλλού.

awk -F '/alu/ {print}' volcano.csv

Η σύνταξη της γλώσσας του awk είναι απλή. Το πρώτο κομμάτι είναι ένα φίλτρο που διαλέξει γραμμές. Εδώ χρησιμοποιούμε ένα regular expression. Αν δεν ξέρεις τι είναι αυτό θα μάθεις μέχρι το τέλος της σειράς. Το δεύτερο κομμάτι ανάμεσα στα {} θα βρει όλες τις γραμμές που περιέχουν κάπου τα γράμματα 'alu'

Ας δούμε τα ηφαίστεια το ελλαδικού χώρου

awk -F, '$3=="Greece" {print $2,"->",$3 }' volcano.csv 

Μπορείς να βρεις την επικινδυνότητα τους;
Πόσα ηφαίστεια έχει η Τουρκία;

Αυτά για σήμερα και αν υπάρξει ενδιαφέρον έχουμε να πούμε πολλά ακόμα. Και βέβαια να θέλεις να πεις εσύ για το awk ή για κάποιο άλλο πρόγραμμα το φορουμ υπάρχει και για αυτό τον λόγο.

Έχεις κάποιο αρχείο με δεδομένα, μικρό ή μεγάλο, σε κείμενο σε απλή μορφή (το awk βγήκε πριν την xml και το json) μπορείς να το δημοσιεύσεις και θέλεις να δούμε μαζί τι πληροφορίες μπορούμε να εξάγουμε από αυτό; Πόσταρε ένα σύνδεσμο σε αυτό

5 Likes