Πώς να χρησιμοποιήσετε το Awk για να εκτυπώσετε πεδία και στήλες σε αρχείο
Σε αυτό το μέρος της σειράς εντολών Linux Awk, θα ρίξουμε μια ματιά σε ένα από τα πιο σημαντικά χαρακτηριστικά του Awk, που είναι η επεξεργασία πεδίου.
Είναι καλό να γνωρίζετε ότι το Awk διαιρεί αυτόματα τις γραμμές εισόδου που του παρέχονται σε πεδία και ένα πεδίο μπορεί να οριστεί ως ένα σύνολο χαρακτήρων που διαχωρίζονται από άλλα πεδία με ένα εσωτερικό διαχωριστικό πεδίου.
Εάν είστε εξοικειωμένοι με το Unix/Linux ή τον προγραμματισμό του κελύφους bash, τότε θα πρέπει να γνωρίζετε ποια είναι η μεταβλητή διαχωρισμού εσωτερικού πεδίου (IFS). Τα προεπιλεγμένα IFS στο Awk είναι η καρτέλα και το διάστημα.
Αυτός είναι ο τρόπος με τον οποίο λειτουργεί η ιδέα του διαχωρισμού πεδίων στο Awk: όταν συναντά μια γραμμή εισόδου, σύμφωνα με το καθορισμένο IFS, το πρώτο σύνολο χαρακτήρων είναι το πεδίο ένα, στο οποίο η πρόσβαση γίνεται χρησιμοποιώντας $1<, το δεύτερο σύνολο χαρακτήρων είναι το πεδίο δύο, στο οποίο η πρόσβαση γίνεται χρησιμοποιώντας $2, το τρίτο σύνολο χαρακτήρων είναι το πεδίο τρία, το οποίο προσεγγίζεται χρησιμοποιώντας $3 και ούτω καθεξής μέχρι το τελευταίο σύνολο χαρακτήρων.
Για να κατανοήσουμε καλύτερα αυτήν την επεξεργασία πεδίου Awk, ας ρίξουμε μια ματιά στα παρακάτω παραδείγματα:
Παράδειγμα 1: Έχω δημιουργήσει ένα αρχείο κειμένου που ονομάζεται tecmintinfo.txt.
vi tecmintinfo.txt
cat tecmintinfo.txt
Στη συνέχεια, από τη γραμμή εντολών, προσπαθώ να εκτυπώσω τα πεδία πρώτο, δεύτερο και τρίτο από το αρχείο tecmintinfo.txt χρησιμοποιώντας την παρακάτω εντολή:
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt
TecMint.comisthe
Από την παραπάνω έξοδο, μπορείτε να δείτε ότι οι χαρακτήρες από τα τρία πρώτα πεδία εκτυπώνονται με βάση το καθορισμένο IFS που είναι το διάστημα:
- Το πρώτο πεδίο που είναι "TecMint.com " είναι προσβάσιμο χρησιμοποιώντας το
$1
. - Το πεδίο δύο που είναι "είναι " είναι προσβάσιμο χρησιμοποιώντας το
$2
. - Το πεδίο τρία που είναι "το " είναι προσβάσιμο χρησιμοποιώντας το
$3
.
Εάν έχετε παρατηρήσει στην εκτυπωμένη έκδοση, οι τιμές των πεδίων δεν διαχωρίζονται και έτσι συμπεριφέρεται η εκτύπωση από προεπιλογή.
Για να δείτε καθαρά την έξοδο με κενό διάστημα μεταξύ των τιμών του πεδίου, πρέπει να προσθέσετε τον τελεστή (,)
ως εξής:
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt
TecMint.com is the
Ένα σημαντικό πράγμα που πρέπει να σημειώσετε και να θυμάστε πάντα είναι ότι η χρήση του ($)
στο Awk είναι διαφορετική από τη χρήση του στο σενάριο κελύφους.
Το σενάριο κάτω από το κέλυφος ($)
χρησιμοποιείται για πρόσβαση στην τιμή των μεταβλητών ενώ στο Awk ($)
χρησιμοποιείται μόνο κατά την πρόσβαση στα περιεχόμενα του ένα πεδίο αλλά όχι για πρόσβαση στην τιμή των μεταβλητών.
Παράδειγμα 2: Ας ρίξουμε μια ματιά σε ένα άλλο παράδειγμα χρησιμοποιώντας ένα αρχείο που περιέχει πολλές γραμμές που ονομάζεται my_shoping.list.
No Item_Name Unit_Price Quantity Price
1 Mouse #20,000 1 #20,000
2 Monitor #500,000 1 #500,000
3 RAM_Chips #150,000 2 #300,000
4 Ethernet_Cables #30,000 4 #120,000
Ας υποθέσουμε ότι θέλετε να εκτυπώσετε μόνο Unit_Price
για κάθε είδος στη λίστα αγορών, θα πρέπει να εκτελέσετε την παρακάτω εντολή:
$ awk '//{print $2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
Το Awk έχει επίσης μια εντολή printf
που σας βοηθά να μορφοποιήσετε την έξοδο σας είναι ένας καλός τρόπος, καθώς μπορείτε να δείτε ότι η παραπάνω έξοδος δεν είναι αρκετά σαφής.
Χρησιμοποιώντας το printf
για να μορφοποιήσετε την έξοδο του Όνομα_Στοιχείου και Τιμή_Μονάδας:
$ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
Περίληψη
Η επεξεργασία πεδίου είναι πολύ σημαντική όταν χρησιμοποιείτε το Awk για να φιλτράρετε κείμενο ή συμβολοσειρές, καθώς σας βοηθά να λαμβάνετε συγκεκριμένα δεδομένα σε στήλες σε μια λίστα. Και να θυμάστε πάντα ότι η χρήση του τελεστή ($)
στο Awk είναι διαφορετική από αυτή στη δέσμη ενεργειών φλοιού.
Ελπίζω ότι το άρθρο ήταν χρήσιμο για εσάς και για τυχόν πρόσθετες πληροφορίες ή ερωτήσεις, μπορείτε να δημοσιεύσετε ένα σχόλιο στην ενότητα σχολίων.