Aggiunta di numeri dal risultato di un grep


23

Eseguo il seguente comando:

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

e ottengo il seguente risultato:

1
4
0
8

Vorrei aggiungere ciascuno dei numeri fino a una variabile di conteggio corrente. C'è una fodera magica che qualcuno può aiutarmi a costruire?

Risposte:


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

Questo non stampa l'elenco ma stampa la somma. Se desideri sia l'elenco che la somma, puoi fare:

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

Shawn - grazie per la tua risposta. Come posso restituire il totale allo script bash da awk?
Amir Afghani,

2
@Amir Useresti il ​​primo come questo variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')Questo inserisce l'output del comando (che è solo il valore della somma) nella variabile chiamatavariable
Shawn J. Goff

3
@Amir Afghani Inoltre, potresti voler cambiare il tuo grep in "[0-9]\+ errors". Ciò corrisponderà se hai una riga che riporta> 9 errori.
Shawn J. Goff,

Sì, wow, non posso credere di essermi perso. Grazie.
Amir Afghani,

Shawn, l'output sembra non sommare i miei risultati. Assomiglia a questo: Errori totali = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Amir Afghani

8

Questo può essere fatto anche in awk:

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

6

Sembra che tu stia utilizzando il sistema GNU , quindi se è disponibile il supporto per le espressioni regolari Perl , potresti scrivere qualcosa del genere:

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

PS Ho modificato l'espressione regolare (aggiunto il quantificatore +) per consentire numeri> 9.

PS In alternativa, awk è sufficiente (supponendo GNU awk ):

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

il primo per me stampa solo ciò che è già andato nel tubo ...
Xerus,

3

Prova a convogliare l'output dal tuo grep in

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

2

Io lo uso questo:

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

Non è efficiente per elenchi di grandi dimensioni, ma per la maggior parte dei miei casi d'uso va bene. Di solito utilizzo una funzione shell per automatizzare il processo in modo da fornire solo un nome 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; }

Puoi sempre sostituire il marcatore di fine riga con uno specifico elemento separatore o classe di caratteri se i tuoi dati sono delimitati in un altro modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.