Bir grep sonucundan numara ekleme


23

Aşağıdaki komutu çalıştırıyorum:

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

ve aşağıdaki sonucu alıyorum:

1
4
0
8

Her sayıyı çalışan bir sayı değişkenine eklemek istiyorum. Birinin inşa etmeme yardım edebileceği bir sihir var mı?

Yanıtlar:


31
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

Bu, listeyi yazdırmaz, ancak toplamı yazdırır. Hem listeyi hem de toplamı istiyorsanız, şunları yapabilirsiniz:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'

Shawn - Cevabınız için teşekkür ederim. Toplamı bask betiğine awk'den nasıl geri getirebilirim?
Amir Afgan

2
@Amir Bunlardan bir tanesini kullanırsınız. variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')Bu komutun çıktısını (sadece toplam değerdir) denilen değişkene koyarvariable
Shawn J. Goff

3
@Amir Afghani Ayrıca, grep'inizi de değiştirmek isteyebilirsiniz "[0-9]\+ errors". > 9 hata bildiren bir hattınız varsa bu eşleşir.
Shawn J. Goff,

Evet, vay bunu kaçırdığıma inanamıyorum. Teşekkür ederim.
Amir Afgan

Shawn, çıktı sanki sonuçlarımı eklemiyor gibi görünüyor. Şuna benzer: Toplam Hata = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani

8

Bütün bunlar awk olarak da yapılabilir:

awk '"[0-9]+ errors" {sum += $1}; END {print sum}' verification_report_3.txt

6

GNU sistemini kullanıyor görünüyorsunuz , eğer Perl düzenli ifadeler desteği varsa, şöyle bir şey yazabilirsiniz:

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

PS Sayıların> 9 olmasına izin vermek için normal ifadeyi değiştirdim (+ nicelik belirteci eklendi).

PS Alternatif olarak, awk yeterlidir ( GNU awk olduğu varsayılarak ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile

benim için ilki, daha önce boruya
girenleri basar

3

Çıkışı grep'inize aktarmayı deneyin

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'

2

Bunu kullanıyorum:

$ echo $(cat file | sed 's/$/+/') 0 | bc

Büyük listeler için verimli değil, ancak kullanım durumlarımın çoğu için sorun değil. İşlemi otomatikleştirmek için genellikle bir kabuk işlevi kullanıyorum, böylece sadece bir dosya adı sağlamak zorunda kalıyorum:

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

Verileriniz başka bir şekilde sınırlandırılmışsa, her zaman satır sonu işaretçisini belirli bir öğe ayırıcı veya karakter sınıfının yerine kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.