A ve B sütunlarının boşlukla ayrılmış değerlerinin bir listesini ekleyin ve toplam sonucunu gösterin [yineleme]
Adlı bir dosyam var fold.txt
. Her satırda bir boşlukla ayrılmış iki değer vardır. İlk değerin A sütununu temsil ettiğini ve boşluktan sonraki ikinci değerin B sütununu temsil ettiğini söylersem, A sütununun tüm değerlerini ve B sütunundaki tüm değerleri nasıl toplayabilirim ve her sütunun toplamını ayrı ayrı gösterebilirim?
Bunun gibi bir şey bekliyorum:
$ cat fold.txt
100 500
200 300
700 100
Çıktı:
Total count Column A = 1000
Total count column B = 900
Yanıtlar
İle awk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
içinde awk metin işleme amaçlı bir araçtır dil, $1
birinci sütunun değeri temsil $2
, ikinci sütunun değeri temsil $3
üçüncü ve benzeri ve bir özel bir NF
son sütun Kimliği temsil ve buna göre $NF
değiştirmek, böylece (son sütunun değerdir $2
yukarıda $NF
da var; ve evet NF
, onu son sütun kimliği olduğunda yakalarsınız , bu nedenle değişkenin değeri size kaç tane sütununuz olduğunu söyler (her satır için değer güncellemesi, girdiden okunur).
Girdi dosyasının boş olduğu ve yine de sayısal çıktı aldığı uç durumu işlemek için, sayısal sonuç çıkarmaya zorlayarak sonuca 0 ekleriz awk
.
varsayılan olarak Space / Tabs kullanan değişken ( F eild S eparator ) ile awk
ayırt edilen sütunlar (veya alanlar) . sütunların farklı karakterlere bölünmesini istiyorsanız, aşağıdaki gibi seçeneğiyle onu yeniden tanımlayabilirsiniz :FS
-F
awk
awk -F'<character-here>' '...' infile
veya BEGIN{...}
şunun gibi blok içinde FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
örneğin aşağıdaki gibi bir girdi dosyası için (artık boşluk yerine virgül kullanılıyor):
100,500
200,300
700,100
awk
kodunuzu aşağıdaki gibi yazabilirsiniz :
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Veya BEGIN
blok içinde :
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
Biraz karmaşıklaşmak ve aşağıdaki örnekte girdi dosyanızın tüm N sütununu toplamak için:
100,500,140,400
200,300,640,200
700,100,400,130
Bu yüzden NF
ilk paragrafta konuştuk (NF değeri size kaç tane sütununuz olduğunu söyler (her satır için güncelleme)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
Buradaki tek yeni şey awk
, aynı sütun kimliğini ele almak i
ve değerlerini $i
bu diziye eklemek için diziyi kullandık (bu dizinin indeksi / anahtarları sütun kimlikleridir); daha sonra END{...}
blokta, gördüğümüz anahtarlar üzerinde dizimizin üzerinden geçiyoruz, sonra önce sütun kimliğini yazdırıyoruz, sonra yanındakilerin toplamını aşağıdaki gibi göreceksiniz:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
DC için iyi bir iş.
dc önce fold.txt'deki verileri ve sum_col_dc'deki koddan sonra gelen verileri okur.
Şöyle kullanın: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
Biraz daha ayrıntıyla:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
DC'nin keyfini çıkarın
. Talep üzerine daha fazla açıklama.