Πώς να χρησιμοποιήσετε το 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 που είναι το διάστημα:

  1. Το πρώτο πεδίο που είναι "TecMint.com " είναι προσβάσιμο χρησιμοποιώντας το $1.
  2. Το πεδίο δύο που είναι "είναι " είναι προσβάσιμο χρησιμοποιώντας το $2.
  3. Το πεδίο τρία που είναι "το " είναι προσβάσιμο χρησιμοποιώντας το $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 είναι διαφορετική από αυτή στη δέσμη ενεργειών φλοιού.

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