Desene Özel Eylemler Kullanarak Metin veya Dizeleri Filtrelemek için Awk Nasıl Kullanılır


Awk komut serisinin üçüncü bölümünde, kullanıcının tanımlayabileceği belirli kalıplara göre metin veya dizeleri filtrelemeye bakacağız.

Bazen metni filtrelerken, belirli bir koşula dayalı olarak veya eşleştirilebilecek belirli bir modeli kullanarak bir girdi dosyasındaki belirli satırları veya dize satırlarını belirtmek istersiniz. Bunu Awk ile yapmak çok kolaydır; bu, Awk'un yararlı bulacağınız harika özelliklerinden biridir.

Aşağıdaki bir örneğe bakalım. Diyelim ki, satın almak istediğiniz gıda ürünleri için food_prices.list adlı bir alışveriş listeniz var. Aşağıdaki gıda maddeleri ve fiyatları listesine sahiptir.

$ 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

Daha sonra fiyatı $2'den büyük olan gıda maddelerine (*) işareti koymak istiyorsanız, bunu aşağıdaki komutu çalıştırarak yapabilirsiniz:

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

Yukarıdaki çıktıdan yiyecek, mango ve ananas içeren satırların sonunda (*) işaretinin olduğunu görebilirsiniz. >. Fiyatlarına baktığınızda 2$'ın üzerinde olduklarını görürsünüz.

Bu örnekte iki kalıp kullandık:

  1. ilki: / *\$[2-9]\.[0-9][0-9] */, gıda maddesi fiyatı $2 'den büyük olan satırları alır ve
  2. ikincisi: /*\$[0-1]\.[0-9][0-9] */, gıda maddesi fiyatı $2'den düşük olan satırları arar .

Olan budur, dosyada dört alan vardır, birinci model, gıda maddesi fiyatının $2'den büyük olduğu bir satırla karşılaştığında, dört alanın tümünü ve bir (*) satırın sonuna bayrak olarak işaret koyun.

İkinci model, food_prices.list girdi dosyasında göründükleri gibi, gıda fiyatının 2$'dan düşük olduğu diğer satırları yazdırır.

Bu şekilde, $2'nin üzerinde fiyatlandırılan gıda maddelerini filtrelemek için kalıba özel eylemleri kullanabilirsiniz, ancak çıktıda bir sorun olsa da, (*) içeren satırlar işareti, çıktının yeterince net olmamasına neden olacak şekilde geri kalan satırlar gibi biçimlendirilmemiştir.

Aynı sorunu awk serisinin 2. Bölümünde de gördük ancak bunu iki şekilde çözebiliriz:

1. Aşağıdaki komutu kullanarak uzun ve sıkıcı bir yol olan printf komutunu kullanarak:

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 alanını kullanma. Awk, giriş satırının tamamını depolamak için 0 değişkenini kullanır. Bu, yukarıdaki sorunu çözmek için kullanışlıdır ve aşağıdaki gibi basit ve hızlıdır:

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

Çözüm

Şimdilik bu kadar ve bunlar, Awk komutunu kullanarak bir dosyadaki metin satırlarını veya dizeleri işaretlemeye yardımcı olabilecek, desene özel eylemi kullanarak metni filtrelemenin basit yollarıdır.

Bu makaleyi faydalı bulacağınızı umarız ve awk aracını kullanarak karşılaştırma operatörlerinin kullanımına odaklanacak olan serinin bir sonraki bölümünü okumayı unutmayın.