Sadık KILIÇ

Web Tabanlı Hafıza Yerleşimi

awk – Sütunları gruplayarak toplama

veri kümesini bir yada daha fazla sutuna göre gruplamak için sql’de GROUP BY ifadesi vardır. Örneğin şöyle bir sorguyla siparis tablosundaki her müşteri için toplam fiyat hesaplanabilir.

SELECT Musteri,SUM(Fiyat) FROM Siparis GROUP BY Musteri

awk ile de bu mantıkla işlem yapılabilir. Örnek için siparis.txt içerisinde aşağıdaki gibi veriler olsun.

cat siparis.txt 
# Must  Ürün    Adet    Fiyat
1  M1   A       3       10
2  M3   A       2       10
3  M2   B       1       20
4  M2   C       2       30
5  M3   A       4       10
6  M1   A       3       30
7  M2   B       4       20

İstenen Çıktı;
1- Her ürünün satış adedi?
2- Her müşterinin toplam harcadığı para?

Awk betiği;

awk '
BEGIN {
        FORMAT="%-10s%s\n"
}
! /^#/ {                                # (1)
        musteri_adet[$2]+=($4*$5)       # (2)
        urun_adet[$3]+=$4               # (3)
}
END {
        printf FORMAT,"URUN","ADET"
        for (i in urun_adet) {
                printf FORMAT,i,urun_adet[i]
        }
 
        printf FORMAT,"MUSTERI","ADET"
        for (i in musteri_adet){
                printf FORMAT,i,musteri_adet[i]
        } 
}' siparis.txt

Özet olarak,
– BEGIN blogunda printf icin kullanılacak format tanımlaniyor.
– (1) başlık satırı olan satır ihmal ediliyor
– (2) Her müsteri için toplam fiyatı hesaplamak için birim fiyat ile satılan ürün adedini çarpılıp, müşterinin önceki değeri ile toplanıyor.
– (3) Her ürünün satış adedini toplanıyor
– END blogunda toplamlar ekrana basılıyor

Çıktı;

URUN      ADET
A         12
B         5
C         2
 
MUSTERI   ADET
M1        120
M2        160
M3        60

,

2 thoughts on “awk – Sütunları gruplayarak toplama

Leave a Reply

Your email address will not be published. Required fields are marked *