A ve B sütunlarının boşlukla ayrılmış değerlerinin bir listesini ekleyin ve toplam sonucunu gösterin [yineleme]

Dec 29 2020

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

5 αғsнιη Dec 29 2020 at 00:00

İ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, $1birinci sütunun değeri temsil $2, ikinci sütunun değeri temsil $3üçüncü ve benzeri ve bir özel bir NFson sütun Kimliği temsil ve buna göre $NFdeğiştirmek, böylece (son sütunun değerdir $2yukarıda $NFda 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 awkayı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-Fawk

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

awkkodunuzu 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 BEGINblok 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 NFilk 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 ive değerlerini $ibu 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
ctac_ Dec 30 2020 at 01:56

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.