Takip et

Bash: Sütun Değerine Göre Dosyayı Birden Çok Dosyaya Bölme

# 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

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.