Πώς να χρησιμοποιήσετε το Awk για να φιλτράρετε κείμενο ή συμβολοσειρές χρησιμοποιώντας συγκεκριμένες ενέργειες για το μοτίβο


Στο τρίτο μέρος της σειράς εντολών Awk, θα ρίξουμε μια ματιά στο φιλτράρισμα κειμένου ή συμβολοσειρών με βάση συγκεκριμένα μοτίβα που μπορεί να ορίσει ένας χρήστης.

Μερικές φορές, όταν φιλτράρετε κείμενο, θέλετε να υποδείξετε ορισμένες γραμμές από ένα αρχείο εισόδου ή γραμμές συμβολοσειρών με βάση μια δεδομένη συνθήκη ή χρησιμοποιώντας ένα συγκεκριμένο μοτίβο που μπορεί να αντιστοιχιστεί. Το να το κάνετε αυτό με το Awk είναι πολύ εύκολο, είναι ένα από τα σπουδαία χαρακτηριστικά του Awk που θα σας φανούν χρήσιμα.

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

$ cat food_prices.list 
No	Item_Name		Quantity	Price
1	Mangoes			   10		$2.45
2	Apples			   20		$1.50
3	Bananas			   5		$0.90
4	Pineapples		   10		$3.46
5	Oranges			   10		$0.78
6	Tomatoes		   5		$0.55
7	Onions			   5            $0.45

Στη συνέχεια, θέλετε να υποδείξετε ένα σύμβολο (*) σε τρόφιμα των οποίων η τιμή είναι μεγαλύτερη από $2, αυτό μπορεί να γίνει εκτελώντας την ακόλουθη εντολή:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

Από την παραπάνω έξοδο, μπορείτε να δείτε ότι υπάρχει ένα σύμβολο (*) στο τέλος των γραμμών με τρόφιμα, μάνγκο και ανανάδες . Εάν ελέγξετε τις τιμές τους, είναι πάνω από τα 2$.

Σε αυτό το παράδειγμα, χρησιμοποιήσαμε δύο μοτίβα:

  1. το πρώτο: / *\$[2-9]\.[0-9][0-9] */ παίρνει τις γραμμές που έχουν τιμή προϊόντος μεγαλύτερη από $2 και
  2. το δεύτερο: /*\$[0-1]\.[0-9][0-9] */ αναζητά σειρές με τιμή φαγητού μικρότερη από 2$ .

Αυτό συμβαίνει, υπάρχουν τέσσερα πεδία στο αρχείο, όταν το μοτίβο συναντά μια γραμμή με τιμή προϊόντος μεγαλύτερη από 2$, εκτυπώνει και τα τέσσερα πεδία και ένα (*) υπογράψετε στο τέλος της γραμμής ως σημαία.

Το δεύτερο μοτίβο απλώς εκτυπώνει τις άλλες γραμμές με τιμή τροφίμων μικρότερη από 2$ όπως εμφανίζονται στο αρχείο εισαγωγής, food_prices.list.

Με αυτόν τον τρόπο μπορείτε να χρησιμοποιήσετε συγκεκριμένες ενέργειες για το μοτίβο για να φιλτράρετε τα τρόφιμα που έχουν τιμή πάνω από 2$, αν και υπάρχει πρόβλημα με την έξοδο, τις γραμμές που έχουν το (*) Τα σημάδια δεν είναι μορφοποιημένα όπως οι υπόλοιπες γραμμές, καθιστώντας την έξοδο όχι αρκετά σαφή.

Είδαμε το ίδιο πρόβλημα στο Μέρος 2 της σειράς awk, αλλά μπορούμε να το λύσουμε με δύο τρόπους:

1. Χρήση της εντολής printf, η οποία είναι μακρά και βαρετή, χρησιμοποιώντας την παρακάτω εντολή:

awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list 

2. Χρήση του πεδίου $0. Το Awk χρησιμοποιεί τη μεταβλητή 0 για να αποθηκεύσει ολόκληρη τη γραμμή εισόδου. Αυτό είναι βολικό για την επίλυση του παραπάνω προβλήματος και είναι απλό και γρήγορο ως εξής:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 

συμπέρασμα

Αυτό είναι προς το παρόν και αυτοί είναι απλοί τρόποι φιλτραρίσματος κειμένου με χρήση συγκεκριμένων ενεργειών για μοτίβο που μπορούν να βοηθήσουν στην επισήμανση γραμμών κειμένου ή συμβολοσειρών σε ένα αρχείο χρησιμοποιώντας την εντολή Awk.

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