# Bash ile Dosyayı Sütun Değerine Göre Bölme
Büyük veri dosyalarını işlerken sıklıkla karşılaştığımız bir problem, bu dosyaları belirli kriterlere göre daha küçük, yönetilebilir parçalara ayırma ihtiyacıdır. Örneğin, milyonlarca satıra sahip bir müşteri veritabanı dosyasını, her biri belirli bir şehre ait müşterileri içeren ayrı dosyalara bölmek isteyebilirsiniz. İşte bu noktada Bash komut satırı aracı devreye girerek bu işlemi otomatikleştirmemize olanak tanır. Bu makalede, Bash kullanarak bir dosyayı belirli bir sütun değerine göre nasıl kolayca ve verimli bir şekilde bölebileceğinizi adım adım öğreneceksiniz.
Öğrenme Yol Haritası
Bu rehber, Bash ile dosya bölme işlemini yeni başlayanlardan ileri seviye kullanıcılara kadar herkesin anlayabileceği şekilde açıklayacaktır.
Yeni Başlayan: (Adım adım açıklama, Basit kod örneği)
Orta: (Gerçek hayat örneği, Optimizasyon ipuçları)
İleri Düzey: (Performans analizi, Edge caseler)
Bash Temelleri: Gereken Komutlar
Dosyayı sütun değerine göre bölmek için öncelikle bazı temel Bash komutlarını bilmemiz gerekiyor. Bu komutlar arasında awk, cut, sort, uniq ve while döngüsü yer alıyor. awk, dosya satırlarını işleyip belirli sütunları ayıklamak için güçlü bir araçtır. cut, belirli sütunları ayırmak için daha basit bir alternatiftir. sort ve uniq ise verileri sıralamak ve benzersiz değerleri bulmak için kullanılır. while döngüsü ise, dosya bölme işlemini otomatikleştirmemize yardımcı olur. Bu komutlar hakkında daha detaylı bilgi için [Fatih Soysal’ın](https://fatihsoysal.com) web sitesindeki Bash eğitimlerine göz atabilirsiniz.
Nasıl Yapılır? Basit Bir Örnek (Yeni Başlayan)
Diyelim ki “musteriler.txt” adlı bir dosyamız var ve bu dosya şu şekilde:
Ad Soyad Şehir
Ahmet Yılmaz İstanbul
Ayşe Kaya Ankara
Mehmet Öz İstanbul
Fatma Gül Ankara
Ali Demir İzmir
Bu dosyayı “Şehir” sütununa göre bölelim. Her şehir için ayrı bir dosya oluşturmak istiyoruz.
Aşağıdaki komut, bunu yapmamıza yardımcı olacaktır:
awk '{print > $3".txt"}' musteriler.txt
Bu komut, awk kullanarak her satırı alır ve üçüncü sütun ($3) değerini dosya adı olarak kullanarak ilgili dosyaya yazar. Yani, İstanbul’a ait satırlar “İstanbul.txt”, Ankara’ya ait satırlar “Ankara.txt” dosyalarına yazılacaktır.
Gerçek Hayat Örneği: Ürün Satış Verilerinin İşlenmesi (Orta Seviye)
Bir e-ticaret şirketinde çalıştığınızı ve günlük satış verilerinin yer aldığı büyük bir CSV dosyanız olduğunu düşünün. Bu dosya, ürün adı, satış adedi, satış tarihi ve şehir gibi sütunları içeriyor. Pazarlama ekibinin, her şehir için ayrı bir satış raporu oluşturmasını istiyorsunuz.
Bu senaryoda, aşağıdaki Bash komutu işinize yarayacaktır:
awk -F ',' '{print > $4".csv"}' satis_verileri.csv
Bu komut, virgülü (,) ayırıcı olarak kullanarak (-F ',') satış verilerini işler ve dördüncü sütun ($4) olan şehir adına göre dosyaları oluşturur. Örneğin, “İstanbul.csv”, “Ankara.csv” gibi dosyalar oluşturulacaktır.
Performans Optimizasyonu (Orta Seviye)
Büyük dosyalar için performansı optimize etmek önemlidir. Örneğin, awk komutu yerine while döngüsü ile cut komutunu kullanarak daha hızlı bir işlem elde edebiliriz. Aşağıdaki örnek, aynı işlemi daha verimli bir şekilde gerçekleştirir:
while IFS=, read -r line; do
city=$(echo "$line" | cut -d ',' -f 4)
echo "$line" >> "$city.csv"
done < satis_verileri.csv
Bu kod, her satırı tek tek okuyarak ve cut komutu ile şehri ayıklayarak daha az kaynak tüketir.
İleri Düzey Teknikler: Hata Yönetimi ve Edge Case’ler
Gerçek dünya verilerinde her zaman beklenmedik durumlar (edge case’ler) olabilir. Örneğin, şehir adında boşluklar veya özel karakterler olabilir. Bu durumları ele almak için ek hata yönetimi eklemeliyiz. Aşağıdaki örnek, şehir adındaki boşlukları ve özel karakterleri temizler:
while IFS=, read -r line; do
city=$(echo "$line" | cut -d ',' -f 4 | sed 's/[^a-zA-Z0-9]//g') # Özel karakterleri kaldırır
city="${city// /_}" # Boşlukları alt çizgi ile değiştirir
echo "$line" >> "$city.csv"
done < satis_verileri.csv
Bu kod, sed komutu kullanarak şehir adındaki özel karakterleri temizler ve boşlukları alt çizgi ile değiştirir. Bu, dosya adlarında sorun yaşanmasını önler.
Performans Analizi ve Karşılaştırma (İleri Seviye)
Farklı yöntemlerin performansını karşılaştırmak için time komutunu kullanabiliriz. Örneğin, awk ve while döngüsü ile cut komutunun performansını şu şekilde karşılaştırabiliriz:
time awk -F ',' '{print > $4".csv"}' satis_verileri.csv
time while IFS=, read -r line; do ... done < satis_verileri.csv
Bu komutlar, her yöntemin çalışma süresini ölçer ve daha hızlı olanı belirlememize yardımcı olur. Büyük dosyalar için, while döngüsü ile cut komutunun genellikle daha hızlı olduğunu göreceksiniz.
Sonuç
Bash, büyük veri dosyalarını verimli bir şekilde işlemek için güçlü bir araçtır. Bu makalede, dosyaları sütun değerine göre bölmenin farklı yöntemlerini ve performans optimizasyon tekniklerini öğrendiniz. Hata yönetimi ve edge case’leri ele alarak, gerçek dünya senaryolarında daha sağlam ve güvenilir çözümler geliştirebilirsiniz.
Sıkça Sorulan Sorular:
1. Dosya çok büyükse ne yapmalıyım? Büyük dosyalar için, dosyayı daha küçük parçalara bölüp her parçayı ayrı ayrı işleyebilir veya daha gelişmiş araçlar (örneğin, parallel) kullanabilirsiniz.
2. Sütun ayırıcı virgül değilse ne yapmalıyım? awk ve cut komutlarında -F seçeneğini kullanarak farklı ayırıcılara uyum sağlayabilirsiniz.
3. Hata oluşursa ne yapmalıyım? Hata yönetimi için bash‘in hata kontrol mekanizmalarını kullanabilir ve hata durumunda uygun işlemler yapabilirsiniz.
4. Farklı sütunlara göre nasıl bölebilirim? Komutlarda sütun numarasını değiştirerek farklı sütunlara göre bölme işlemi yapabilirsiniz.
5. Dosya isimlerini nasıl özelleştirebilirim? Dosya isimlerini oluştururken değişkenler ve diğer Bash özellikleri kullanarak özelleştirebilirsiniz.
Yazar: Fatih Soysal