Menambahkan angka dari hasil grep

23

Saya menjalankan perintah berikut:

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

dan saya mendapatkan hasil berikut:

1
4
0
8

Saya ingin menambahkan masing-masing angka hingga variabel penghitungan berjalan. Apakah ada satu kapal ajaib yang bisa saya bantu buat?

Amir Afghani
sumber

Jawaban:

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

Itu tidak mencetak daftar tetapi mencetak jumlahnya. Jika Anda ingin daftar dan jumlah, Anda dapat melakukan:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'
Shawn J. Goff
sumber
Shawn - terima kasih atas jawaban Anda. Bagaimana cara mengembalikan total kembali ke skrip bash dari awk?
Amir Afghani
2
@Amir Anda akan menggunakan yang pertama seperti ini. variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')Ini menempatkan output dari perintah (yang hanya nilai penjumlahan) ke dalam variabel yang disebutvariable
Shawn J. Goff
3
@Amir Afghani Juga, Anda mungkin ingin mengubah grep Anda "[0-9]\+ errors". Ini akan cocok jika Anda memiliki pelaporan garis> 9 kesalahan.
Shawn J. Goff
Yup, wow aku tidak percaya aku melewatkan itu. Terima kasih.
Amir Afghani
Shawn, hasilnya sepertinya tidak menambah hasil saya. Kelihatannya seperti ini: Total Kesalahan = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani
8

Ini semua bisa dilakukan dengan awk juga:

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

Anda tampaknya menggunakan sistem GNU , jadi jika Perl dukungan ekspresi reguler tersedia, Anda dapat menulis sesuatu seperti ini:

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

PS Saya mengubah ekspresi reguler (menambahkan + quantifier) ​​untuk memungkinkan angka> 9.

PS Atau, awk sudah cukup (dengan asumsi GNU awk ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile
Dimitre Radoulov
sumber
yang pertama untuk saya baru saja mencetak apa yang sudah masuk ke pipa ...
Xerus
3

Coba perpipkan output dari grep Anda

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

sumber
2

Saya menggunakan ini:

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

Ini tidak efisien untuk daftar besar, tetapi untuk sebagian besar kasus penggunaan saya baik-baik saja. Saya biasanya menggunakan fungsi shell untuk mengotomatiskan proses sehingga saya hanya perlu memberikan nama file:

## 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; }

Anda selalu dapat mengganti penanda garis akhir untuk pemisah elemen tertentu atau kelas karakter jika data Anda dibatasi dengan cara lain.

bocor
sumber