Mövzunu Açan #1
awk ile çıktı formatını düzenleme

[quote]Giriş ve amacın netleşmesi
Birçok senaryoda awk ile elde edilen ham çıktıyı belirli bir formata dönüştürmek gerekir. Örneğin log dosyaları üzerinde alanları yeniden sıralamak, sütunlara sabit genişlikler atamak veya etiketi olmayan verileri yeniden yapılandırmak. awk’nin temel gücü, satırları belirli alanlara ayırıp her alan için dönüşümler tanımlayabilmendir. Bu süreçte dikkat edilmesi gerekenler:
  • girdi dosyasının yapısının ve sütunların sabit uzunlukta mı yoksa değişken mi olduğunu belirlemek
  • hedef formatın hangi alanları içerdiğini ve aralarına hangi ayırıcıları koyacağını netleştirmek
  • çıktı karakter kümelerinizi ve dosya kodlamasını düşünmek (ör. UTF-8)


1) Alanları ayırma ve yeniden düzenleme
awk, varsayılan olarak boşluk ve sekme ile alanları ayırır. Ancak gerektiğinde alan ayrıştırmayı özelleştirmek önemlidir.
  • Basit kısmi yeniden format: bir log satırında tarih, saat ve mesajı yeniden düzenlemek
  • Örneğin: awk '{print $1"|" $2"|" $0}' dosya.txt
  • Alan sayısının değişken olduğu durumlarda NF değişkenini kullanmak faydalıdır: awk '{printf "%s-%s: %s\n", $1, $2, $3}'


2) Sabit genişlikte alanlar üretme
Çıktıyı sabit sütun genişliklerine dönüştürmek için printf ile genişlik belirlemek gerekir.
  • Örnek: tarih (10), seviye (5), mesaj (sonrası)
  • awk '{printf "%-10s | %-5s | %s\n", $1, $2, substr($0, index($0,$3))}' dosya.txt
  • Bu yaklaşım, alanlar arasındaki ayrışmayı korur ve hizalı bir tablo benzeri çıktı verir


3) Çıktıyı bir tabloya dönüştürme
Bazı durumlarda çıktı CSV veya TSV gibi makineler arası kolaylaştırır.
  • CSV için özel karakterleri kaçır: awk '{gsub(/"/,"\""); printf "\"%s\",\"%s\",\"%s\"\n",$1,$2,$3}'
  • TSV için: awk '{print $1"\t"$2"\t"$3}'


4) Çok sütunlu ve karmaşık dönüşümler
  • Özet tablo üretimi: grup, sayım veya toplam
  • Örnek: sütun 1 kategori, sütun 2 değer; toplam değerleri hesaplamak için

awk '{sum[$1] += $2} END {for (k in sum) print k, sum[k]}' dosya.txt
  • Birden çok alanı birleştirme: printf("%s-%s %s\n", $1, $2, substr($0, index($0,$3)))


5) Kod güvenliği ve performans ipuçları
  • Büyük dosyalar için satırları akış halinde işlemek; dosyayı akış modunda işlemek gerekir
  • Gereksiz tekrar hesaplamalardan kaçınmak için değişkenleri yerel olarak kullanmak
  • I/O kırpma: NR ile belirli satır aralıklarında işlem


Sonuç
awk ile çıktı formatını düzenlemek, alanları seçici olarak yeniden biçimlendirmek, sabit genişlikte sütunlar oluşturmak ve gerektiğinde özet tablolar üretmek için doğrudan ve esnek bir yol sunar. Özellikle değişken yapıdaki verileri tek bir standart formata dönüştürmede güçlüdür. Bu teknikleri kendi dosya yapınıza uyarlayarak hangi dönüşümün gerekliğini netleştirebilirsiniz.

Cavab vermək üçün daxil olmalısınız.

Bu mövzunu görüntüləyən istifadəçilər (Cəmi: 1, Üzvlər: 1, Qonaqlar: 0)
Cəmi: 1 (üzvlər: 1, qonaqlar: 0)
0 sitat seçildi