awk — συγκεντρωτικός οδηγός — DedSec Project
awk — συγκεντρωτικός οδηγός AWK Έννοια Η AWK διαβάζει records και πεδία από stream. Το $0 είναι όλη η γραμμή και το $1 το πρώτο πεδίο με βάση τον διαχωριστή. Παράδειγμα πηγαίου κώδικα ή…
AWK
Έννοια
Η AWK διαβάζει records και πεδία από stream. Το $0 είναι όλη η γραμμή και το $1 το πρώτο πεδίο με βάση τον διαχωριστή.
Παράδειγμα πηγαίου κώδικα ή χρήσης
printf 'A 3\nB 4\n' | awk '{sum += $2} END {print sum}'
Άσκηση με συγκεκριμένο στόχο
Επαλήθευσε άθροισμα επτά και χρησιμοποίησε -F ',' σε δεδομένα με κόμματα για σωστή διάσπαση πεδίων.
Έλεγχος και διάγνωση
Ο διαχωρισμός με κενά δεν αποτελεί CSV parser· quotes και embedded newlines απαιτούν κατάλληλο εργαλείο.
Σημείωσε την είσοδο, το αναμενόμενο αποτέλεσμα και το πραγματικό αποτέλεσμα στην εγκατεστημένη έκδοση της AWK. Αν ο κώδικας δεν είναι προσβάσιμος από το κινητό, κράτησε το παράδειγμα ως μη δοκιμασμένο και εξήγησε τη σημασιολογία αντί να ισχυριστείς επιτυχία. Κάνε μια δεύτερη δοκιμή που απομονώνει μόνο τον μηχανισμό της άσκησης και κράτησε ακριβές σφάλμα με τρόπο που να μην εκθέτει προσωπικά δεδομένα.
AWK — Αναλυτικός οδηγός εξάσκησης
Πού είναι χρήσιμο
Η AWK διαβάζει γραμμές και πεδία χωρίς Python ή εξωτερικά πακέτα. Είναι κατάλληλη για απλά, γνωστά text formats. Το TSV δεν είναι πλήρης CSV parser: εισαγωγικά, κόμματα και πολυγραμμικές τιμές έχουν άλλες απαιτήσεις.
Προετοιμασία
Αποθήκευσε τον κώδικα σε report.awk. Φτιάξε sample.tsv με πραγματικό tab μεταξύ στηλών: team TAB points, έπειτα red TAB 6, blue TAB 5, red TAB 4. Εκτέλεσε awk -f report.awk sample.tsv | sort. Περιμένεις blue TAB 5 και red TAB 10.
BEGIN { FS = "\t"; bad = 0 }
NR == 1 {
if ($1 != "team" || $2 != "points") bad = 1
next
}
NF != 2 || $1 == "" || $2 !~ /^[0-9]+$/ { bad = 1; next }
{ totals[$1] += $2; seen[$1]++ }
END {
if (bad) { print "invalid TSV" > "/dev/stderr"; exit 2 }
for (team in totals) print team "\t" totals[team]
}
Κατανόηση
Το BEGIN εκτελείται πριν την πρώτη εγγραφή, το NR==1 ελέγχει την κεφαλίδα και το END τυπώνει τα σύνολα. Η σειρά επανάληψης associative arrays δεν είναι εγγυημένη, γι' αυτό ταξινομούμε την έξοδο. Το NF μετρά πεδία· η κανονική έκφραση απορρίπτει κείμενο όπως 4x αντί για αριθμό.
Τεστ ορίων
Δοκίμασε γραμμή χωρίς πεδίο, αρνητικό σκορ, δεύτερη κεφαλίδα, άδεια ομάδα και περιττό tab. Η AWK πρέπει να εμφανίσει invalid TSV και να επιστρέψει status 2. Προσοχή: όταν η έξοδος περνά από sort, ένα shell χωρίς pipefail μπορεί να κρύψει το exit status της AWK.
Μεταφερσιμότητα
Οι περισσότερες POSIX AWK υποστηρίζουν τη βασική σύνταξη. Το /dev/stderr είναι διαδεδομένο σε Linux και Termux αλλά όχι σε όλα τα συστήματα. Για αυστηρή μεταφερσιμότητα χρησιμοποίησε ρητά ρυθμισμένο προορισμό σφάλματος. Διαχώρισε τις επεκτάσεις GNU gawk από την κοινή AWK. Επιτυχία: δύο αθροίσματα, απόρριψη κακού TSV. https://www.gnu.org/software/gawk/manual/
AWK — Παραδείγματα πραγματικού κώδικα
Πρόβλημα και συμβόλαιο
Διάβασε TSV με δύο στήλες team και points. Απαιτούμε ακριβή κεφαλίδα, μη κενό όνομα ομάδας και μη αρνητικό ακέραιο βαθμό. Δεν πρέπει η αυτόματη μετατροπή "abc" σε μηδέν να αποκρύψει την άκυρη εγγραφή.
Εκτελέσιμο παράδειγμα
Αποθήκευσε ως totals.awk:
BEGIN { FS="\t"; OFS="\t"; bad=0 }
NR==1 { if (NF!=2 || $1!="team" || $2!="points") { bad=1; exit 2 }; next }
NF!=2 || $1=="" || $2 !~ /^[0-9]+$/ { bad=1; next }
{ totals[$1]+=$2 }
END {
if (NR==0 || bad) exit 2
for (team in totals) print team,totals[team]
}
Δημιούργησε είσοδο: printf 'team\tpoints\nred\t4\nblue\t2\nred\t3\n' > scores.tsv. Τρέξε awk -f totals.awk scores.tsv | sort. Αναμένονται blue με 2 και red με 7. Χρησιμοποίησε πραγματικά tabs· ένα CSV με κόμμα χρειάζεται άλλο FS.
Έλεγχος αποτυχιών
Εκτέλεσε awk -f totals.awk scores.tsv > out.tsv χωρίς pipeline ώστε να δεις τον πραγματικό κωδικό επιστροφής. Έλεγξε κενό αρχείο, λάθος header, τρεις στήλες, μη αριθμητική τιμή και αρχείο χωρίς τελικό newline. Στο shell το awk | sort μπορεί να κρύψει τον κωδικό AWK χωρίς pipefail. Μην χρησιμοποιείς το αποτέλεσμα όταν το πρόγραμμα απέτυχε.
Εργαστήριο
Πρόσθεσε τρίτη στήλη department, ομαδοποίησε κατά team και department, και φτιάξε σταθερή σειρά εξόδου. Αντέστρεψε τις γραμμές της εισόδου και σύγκρινε την αναφορά. Τεκμηρίωσε αν επιτρέπονται δεκαδικά ή αρνητικοί αριθμοί και πώς θα τους επικύρωνες.
AWK — Διαδρομή ουσιαστικής εξάσκησης
Θεμελιώδης κατανόηση
Το AWK διαβάζει μία εγγραφή κάθε φορά. Το FS ορίζει το διαχωριστικό πεδίων και το NR μετρά εγγραφές μαζί με την κεφαλίδα. Οι συσχετιστικοί πίνακες συγκεντρώνουν σύνολα ανά ομάδα, αλλά η σειρά επανάληψης δεν είναι εγγυημένη. Έλεγξε τη μορφή πριν από την πρόσθεση: η αυτόματη αριθμητική μετατροπή μπορεί να κρύψει άκυρη είσοδο. Η ταξινόμηση γίνεται στο τελικό αποτέλεσμα.
Κώδικας προς δοκιμή
BEGIN { FS="\t"; OFS="\t" }
NR == 1 { if ($1 != "team" || $2 != "points") { bad=1; exit 2 } next }
NF != 2 || $1 == "" || $2 !~ /^[0-9]+$/ { bad=1; next }
{ total[$1]+=$2 }
END {
if (NR == 0 || bad) exit 3
for (team in total) print team,total[team]
}
Εκτέλεση και ερμηνεία
Δημιούργησε TSV scores.tsv με team,points, red,4, blue,2, red,3 (τα κόμματα εδώ δηλώνουν πραγματικά TABs). Τρέξε awk -f sum.awk scores.tsv | sort. Περίμενε blue<TAB>2 και red<TAB>7. Δοκίμασε μη αριθμητικό σκορ και έλεγξε το exit code του AWK: ένα pipe με sort μπορεί να κρύψει αποτυχία χωρίς pipefail.
Πρακτική εργασία
Πρόσθεσε απόρριψη αρνητικών σκορ και κενών ονομάτων. Ανακάτεψε τις εγγραφές: τα σύνολα πρέπει να μείνουν ίδια. Δοκίμασε κενό αρχείο, λάθος κεφαλίδα και τελευταία εγγραφή χωρίς newline. Εξήγησε γιατί η ταξινόμηση της εισόδου δεν εξασφαλίζει σειρά κλειδιών του πίνακα.
AWK — Τεχνικά σημεία και συχνές παγίδες
FS, NR, FNR και NF
Το FS καθορίζει πώς χωρίζονται οι εγγραφές σε πεδία. Το προεπιλεγμένο whitespace handling δεν ισοδυναμεί με αυστηρό TSV. Το NR είναι ο συνολικός αριθμός εγγραφών, ενώ το FNR αρχίζει πάλι από 1 σε κάθε νέο αρχείο. Το NF μετρά τα πεδία στην τρέχουσα εγγραφή.
BEGIN { FS=","; OFS="|" }
FNR==1 { print "header", FILENAME, $0; next }
NF==3 { print FILENAME,FNR,$1,$3 }
Το παράδειγμα είναι απλό διαχωριστικό κειμένου: δεν είναι πλήρης CSV parser για πεδία με εισαγωγικά και ενσωματωμένα κόμματα.
Σιωπηρές αριθμητικές μετατροπές
Η μετατροπή "12x"+0 δεν επικυρώνει ότι ένα πεδίο αποτελεί καθαρό αριθμό. Πριν από άθροιση χρησιμοποίησε regex που καλύπτει ολόκληρη την τιμή. Αν επιτρέπονται δεκαδικοί, πρόσεξε ρυθμίσεις locale και τις διαφορές υλοποιήσεων. Η συνένωση συμβολοσειρών στο AWK γίνεται χωρίς σύμβολο τελεστή, επομένως τοποθέτησε σαφείς παρενθέσεις όπου χρειάζονται.
Σειρά εμφάνισης και exit
Η σειρά for (key in array) δεν είναι εγγυημένη· ταξινόμησε όταν απαιτείται αναπαραγώγιμη αναφορά. Το END μπορεί να εκτελεστεί και αφού γίνει exit από λάθος· φύλαξε flag αποτυχίας ώστε να μη δημοσιεύσεις μερικά αποτελέσματα.
Εργαστήριο και εμβέλεια
Δοκίμασε δύο files με ξεχωριστές κεφαλίδες, κενή δεύτερη στήλη, CRLF και τελευταία γραμμή χωρίς newline. Σύγκρινε τις πραγματικές αποκλίσεις διαθέσιμων awk/mawk/gawk. Κατάγραψε εκδόσεις και exit statuses. Μην εισάγεις ειδικές συναρτήσεις gawk όταν απαιτείται POSIX awk.