Προγραμματισμός με gawk μέρος 2ο: Advanced Output
Description: This is issue 24 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #24
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
Επόμενο Προηγούμενο Περιεχόμενα ### 5. Advanced Output Μερικές πιο ειδικευμένες δυνατότητες υπάρχουν στην awk για την έξοδο (output). Αυτές είναι: το "όμορφο" φορμάρισμα του κειμένου, η ανακατεύθυνση του output σε αρχεία (κειμένου) και η διασωλήνωση του output στην είσοδο (input) άλλων (εξωτερικών) εντολών του command prompt. ### 5.1 Printf Η εντολή print που είδαμε (στο 1ο μέρος), είναι αρκετά απλή και το output της είναι και αυτό αρκετά απλό. Αν, όμως, θέλετε να έχετε μορφοποιημένη την έξοδο του προγράμματός σας (παραγωγή στηλών, για παράδειγμα), τότε θα πρέπει να χρησιμοποιήσετε την δανεισμένη από τη C εντολή, την printf. H printf έχει την εξής γενική μορφή:
      printf("αλφαριθμητικό ελέγχου", λίστα_ορισμάτων, 1ο όρισμα, 2ο όρισμα, κ.ο.κ.)
Το αλφαριθμητικό ελέγχου, μπορεί να αποτελείται από τα εξής στοιχεία: Απλούς χαρακτήρες (δηλαδή κείμενο) ειδικούς μεταχαρακτήρες (θυμάστε το \n π.χ.) Τις διαταγές φόρμας Ας δούμε από ένα παράδειγμα για τα παραπάνω τρία στοιχεία, και μετά να μιλήσουμε περισσότερο για τις διαταγές φόρμας: printf("hello world") printf("\f") printf("%22s", "Magaz") Και φυσικά, συνδυασμό όλων αυτών των στοιχείων (θα το δούμε) #### Διαταγές φόρμας Λοιπόν, κάθε διαταγή φόρμας αποτελείται από 3 μέρη. Στο 1ο μέρος, ΠΑΝΤΑ, γράφουμε το σύμβολο του ποσοστού (%). Κάθε διαταγή φόρμας αρχίζει με αυτό το σύμβολο. Το 2ο μέρος συμπληρώνεται προαιρετικά. Συμπληρώνεται με αριθμούς, οι οποίοι υποδηλώνουν το μέγιστο μήκος της εξόδου. Τέλος, το 3ο μέρος αποτελείται από ειδικούς χαρακτήρες, οι οποίοι υποδηλώνουν το είδος της εξόδου (αν είναι αλφαριθμητικό, αν είναι δεκαδικός αριθμός κλπ.) Θα μιλήσουμε τώρα αναλυτικότερα για το 2ο μέρος και μετά θα δούμε έναν πίνακα με τους χαρακτήρες του 3ου μέρους. Ο αριθμός, το εύρος πεδίου, αποτελείται από δύο αριθμούς οι οποίοι χωρίζονται με μία τελεία (.), δηλαδή είναι της μορφής x.y. Αν η έξοδος μας είναι δεκαδικός αριθμός, τότε ο αριθμός αριστερά από την τελεία υποδηλώνει τον αριθμό ψηφίων ΟΛΟΥ του αριθμού (συμπεριλαμβανόμενης της τελείας (.) του αριθμού), ενώ ο αριθμός δεξιά από την τελεία υποδηλώνει τον αριθμό ψηφίων του δεκαδικού μέρους του αριθμού. Αν τώρα, η έξοδος μας δεν είναι δεκαδικός αριθμός, αλλά ο,τιδήποτε άλλο, τότε ο αριθμός αριστερά από την τελεία είναι ο ελάχιστος αριθμός ψηφίων/χαρακτήρων αυτού που θα τυπώσουμε, ενώ ο αριθμός δεξιά της τελείας είναι ο μέγιστος αριθμός ψηφίων/χαρακτήρων και ο "πραγματικός" αριθμός των ψηφίων/χαρακτήρων που τελικά θα εκτυπωθούν. Δηλαδή, μπορείτε κάλλιστα να παραλείψετε τον αριθμό αριστερά της τελείας (π.χ. %.4s) ΣΗΜΕΙΩΣΕΙΣ: Αν θέλετε μέσα από την printf να τυπώσετε τον χαρακτήρα %, τότε θα γράψετε μέσα στον κώδικά σας %%. Εξ ορισμού, η έξοδος της printf είναι σε δεξιά στοίχιση. Αν θέλετε να έχετε αριστερή, τότε μπροστά από τον αριθμό που βρίσκεται αριστερά της τελείας (στο εύρος πεδίου) βάζετε το σύμβολο μείον (-). Παρακάτω, βλέπετε τον πίνακα με τους χαρακτήρες που μπορείτε να χρησιμοποιήσετε. Στη συνέχεια θα δούμε και παραδείγματα.
Κωδικός φόρμας | Σημασία
%c | Χαρακτήρας ASCII
%d | Ακέραιος δεκαδικός αριθμός
%i | Το ίδιο με το %d
%e | Εκτύπωση δεκαδικού αριθμού κινητής υποδιαστολής με επιστημονική σημειογραφία, δηλαδή της μορφής [-]x.xxxxe[-/+]xxx
%f | Δεκαδικός κινητής υποδιαστολής
%g | Η awk κρίνει και διαλέγει για έναν αριθμό μία από τις μορφές %e και %f (όποια έχει μικρότερο μήκος) και, παράλληλα, "απαλοίφει" άχρηστα μηδενικά
%o | Μη προσημασμένος (χωρίς πρόσημο) ακέραιος οκταδικός αριθμός
%s | Αλφαριθμητικό
%x | Μη προσημασμένος ακέραιος δεκαεξαδικός αριθμός (με πεζά τα abcdef)
%X | Μη προσημασμένος ακέραιος δεκαεξαδικός αριθμός (με κεφαλαία τα ABCDEF)
#### Παραδείγματα Επειδή θέλω να σας δείξω την λειτουργία του εύρους πεδίου, θα συμβολίζω τα κενά με παύλα (-), ώστε να μπορείτε να μετρήσετε τους χαρακτήρες και τα κενά (και να βγάλετε τα συμπεράσματά σας):
    printf("%10d\n", 29) (θα έχει σαν αποτέλεσμα:) --------29

    printf("%-10d\n", 29)                          29--------

    printf("%10.3f\n", 123.56)                     ---123.560

    printf("%15s\n", "Linux Magaz")              ----Linux Magaz

    printf("%-15s\n", "Linux Magaz")             Linux Magaz----
### 5.2 Output σε αρχείο Όπως και στην περίπτωση της getline, έτσι και εδώ, μπορείτε να χρησιμοποιήσετε τα σύμβολα της ανακατεύθυνσης για να στείλετε την έξοδο κατ' ευθείαν μέσα σε ένα αρχείο. Π.χ:
    printf("hello world\n") > "filename"
    printf("hello world\n") >> "filename"
### 5.3 Output σε εντολή Σε αυτήν την περίπτωση, έχετε την δυνατότητα να στείλετε έξοδο (output) στην είσοδο (input) μιάς εξωτερικής εντολής του UNIX. Π.χ:
    printf("hello world\n") | "sort -t , "
### 5.4 Τερματίζοντας το Output από αρχείο ή εντολή Ακριβώς για τους ίδιους λόγους που αναφέραμε στην getline, έτσι και εδώ, καλό θα ήταν να "κλείνετε" ένα αρχείο ή μία εντολή αφού τελειώσετε με αυτά. Η σύνταξη είναι ακριβώς η ίδια: close ("filename") και στη θέση του filename χρησιμοποιείτε είτε όνομα αρχείου, είτε το όνομα της ΑΚΡΙΒΟΥΣ εντολής που τρέξατε με διασωλήνωση, είτε το όνομα κάποιας μεταβλητής που "δείχνει" σε αρχείο. Επόμενο Προηγούμενο Περιεχόμενα