# awk ile Belirli Sütun Değerine Sahip Satırları Yazdırma
Veri işlemede, büyük veri dosyalarından belirli kriterlere uyan satırları ayıklamak sıkça karşılaşılan bir ihtiyaçtır. awk komutu, bu görevi oldukça etkili bir şekilde yerine getiren güçlü bir araçtır. Bu makalede, awk kullanarak bir sütunun değerine göre satırları yazdırmayı, başlangıç seviyesinden uzman seviyesine kadar adım adım öğreneceğiz. Veri analizi ve işlemede zaman kazandıracak pratik çözümler ve gerçek dünya senaryoları ile desteklenmiş örnekler sunacağız.
Öğrenme Yol Haritası
Bu makale, awk ile sütun değerine göre satır yazdırmayı üç aşamada ele alacaktır:
* Yeni Başlayan: Temel awk sözdizimi ve basit örnekler ile başlayacağız.
* Orta: Gerçek hayat senaryoları ve optimizasyon ipuçları ile devam edeceğiz.
* İleri Düzey: Performans analizi, karmaşık durumlar ve hata yönetimi konularını inceleyeceğiz.
1. awk Temelleri: İlk Adımlar
awk komutu, her satırı belirli bir kurala göre işleyen bir metin işleme aracıdır. Bir dosyadaki her satır, awk tarafından alanlara (sütunlara) ayrılır. Varsayılan ayırıcı boşluktur, ancak -F seçeneği ile değiştirilebilir. awk komutunun temel yapısı şu şekildedir:
awk '{komutlar}' dosya_adi
Örneğin, data.txt adlı bir dosyamız olsun:
Ad Soyad Yaş Şehir
Ahmet Yılmaz 30 Ankara
Ayşe Kaya 25 İstanbul
Mehmet Öz 40 İzmir
Bu dosyadan sadece “Yaş” sütununu yazdırmak için şu komutu kullanabiliriz:
awk '{print $3}' data.txt
Bu komut, her satırdaki 3. sütunu (Yaş) ekrana yazdıracaktır. $1, ilk sütun, $2 ikinci sütun ve benzeri şekilde devam eder. print komutu, awk içindeki temel yazdırma işlemidir.
2. Sütun Değerine Göre Satırları Seçme: Koşullu Yazdırma
Şimdi asıl konumuza gelelim: belirli bir sütunun değerine göre satırları filtrelemek. Bunun için awk‘ın koşullu ifadelerini kullanacağız. if ifadesi ile bir koşul belirleyip, bu koşulu sağlayan satırlar için komutlarımızı çalıştırabiliriz.
Örneğin, data.txt dosyasından sadece yaşı 30’dan büyük olan kişilerin bilgilerini yazdırmak için:
awk '$3 > 30 {print $0}' data.txt
Burada $3 > 30 koşulu, üçüncü sütunun (Yaş) 30’dan büyük olup olmadığını kontrol eder. Koşul doğruysa, print $0 komutu tüm satırı ($0) yazdırır.
3. Gerçek Dünya Örneği: Web Sunucu Log Dosyası Analizi
Bir web sunucusunun log dosyasını ele alalım. Bu dosya, her istek için tarih, saat, IP adresi, istek edilen URL ve diğer bilgileri içerir. Diyelim ki, belirli bir IP adresinden gelen istekleri filtrelemek istiyoruz. Log dosyasının her satırı şu şekilde olsun:
192.168.1.100 - - [20/Oct/2023:10:00:00 +0300] "GET /index.html HTTP/1.1" 200 1234
192.168.1.100 IP adresinden gelen istekleri bulmak için:
awk -F ' ' '$1 == "192.168.1.100" {print $0}' access_log.txt
Burada -F ' ' ile alan ayırıcısını boşluk olarak belirledik. $1 == "192.168.1.100" koşulu, ilk sütunun (IP adresi) 192.168.1.100’e eşit olup olmadığını kontrol eder.
4. Performans Optimizasyonu: Büyük Dosyalar İçin İpuçları
Büyük log dosyalarında işlem süresini optimize etmek önemlidir. awk‘ın performansını artırmak için şu ipuçlarını kullanabiliriz:
* Gerekli Sütunları Seçmek: Tüm satırı ($0) değil, sadece gerekli sütunları yazdırmak işlem süresini kısaltır.
* gawk kullanmak: gawk (GNU awk), bazı durumlarda daha hızlı çalışabilir.
* -v seçeneği ile değişken tanımlamak: Değişkenleri önceden tanımlamak, tekrarlayan hesaplamaları azaltır.
* getline kullanımı: Çok büyük dosyalar için satır satır okuyarak işlem yapılması performansı artırabilir. Bu ileri düzey bir tekniktir ve dikkatli kullanılmalıdır.
5. İleri Düzey Teknikler: Karmaşık Koşullar ve Desen Eşleştirme
awk‘ın gücü, sadece basit karşılaştırma işlemlerini değil, karmaşık koşullar ve desen eşleştirmelerini de desteklemesinden gelir. Örneğin, bir URL’nin belirli bir kelimeyi içerip içermediğini kontrol edebiliriz:
awk -F ' ' '$7 ~ /index/ {print $0}' access_log.txt
Burada $7 ~ /index/, yedinci sütunun (URL) “index” kelimesini içerip içermediğini kontrol eder. ~ sembolü, düzenli ifade eşleştirme operatörüdür.
6. Hata Yönetimi ve Edge Case’ler
Gerçek dünya verileri her zaman mükemmel olmaz. Eksik veriler, beklenmedik formatlar gibi durumlarla karşılaşabiliriz. Bu durumlar için hata yönetimi stratejileri geliştirmeliyiz. Örneğin, bir sütunun boş olup olmadığını kontrol ederek işlemi durdurabilir veya varsayılan bir değer atayabiliriz.
awk -F ',' '{if ($3 != "") {print $3} else {print "Eksik veri"}}' data.csv
Bu örnekte, üçüncü sütun boşsa “Eksik veri” yazdırılır.
7. Vaka Analizi: Ürün Satış Verilerinin Analizi
Bir e-ticaret sitesinin satış verilerini içeren bir CSV dosyamız olsun. Bu dosyada ürün adı, satış fiyatı ve satış adedi gibi bilgiler bulunmaktadır. Diyelim ki, satış fiyatı 100 TL’den fazla olan ürünleri bulmak istiyoruz:
awk -F ',' '$2 > 100 {print $1, $2, $3}' sales.csv
Bu komut, ikinci sütun (satış fiyatı) 100’den büyük olan satırları yazdırır ve ürün adı, satış fiyatı ve satış adetini gösterir.
8. Sonuç
awk, büyük veri dosyalarından belirli kriterlere uyan satırları ayıklamak için son derece güçlü ve verimli bir araçtır. Bu makalede, awk‘ın temel kullanımından ileri düzey tekniklere kadar geniş bir yelpazede bilgi vermeye çalıştık. Gerçek dünya örnekleri ve performans optimizasyonu ipuçları ile awk‘ı daha etkili kullanabilirsiniz. Daha fazla bilgi için [Fatih Soysal’ın bloguna](https://fatihsoysal.com) göz atabilirsiniz.
Sıkça Sorulan Sorular
1. awk‘ı hangi işletim sistemlerinde kullanabilirim? awk, Linux, macOS ve diğer Unix benzeri sistemlerde kullanılabilir. Windows’ta da Cygwin veya WSL gibi araçlar ile kullanılabilir.
2. awk‘ta düzenli ifadeler nasıl kullanılır? ~ operatörü ile düzenli ifadeler kullanılabilir. Örneğin, $1 ~ /pattern/ ifadesi, birinci sütunun “pattern” düzenli ifadesini içerip içermediğini kontrol eder.
3. awk‘ta birden fazla koşul nasıl belirlenir? && (ve) ve || (veya) operatörleri ile birden fazla koşul belirlenebilir. Örneğin, $1 == "value1" && $2 > 10 ifadesi, birinci sütunun “value1″e eşit ve ikinci sütunun 10’dan büyük olduğu satırları seçer.
4. awk‘ta sayısal işlemler nasıl yapılır? awk, toplama, çıkarma, çarpma, bölme gibi standart sayısal işlemleri destekler.
5. awk‘ta dosya nasıl okunur? awk '{komutlar}' dosya_adi şeklinde dosya okunur.
Yazar: Fatih Soysal