Додавання чисел із результату грепа


23

Я запускаю таку команду:

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

і я отримую такий результат:

1
4
0
8

Я хотів би додати кожне з чисел до змінної поточної кількості. Чи є один чарівний один лайнер, який хтось може допомогти мені побудувати?

Відповіді:


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

Це не друкує список, але друкує суму. Якщо ви хочете і список, і суму, ви можете зробити:

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

Шон - дякую за вашу відповідь. Як повернути загальну версію до скрипту bash з awk?
Амір Афгані

2
@Amir Ви б використали першу подібну. variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')Це ставить вихід команди (що є лише значенням суми) у змінну під назвоюvariable
Шон Дж. Гофф

3
@Amir Afghani Крім того, ви можете змінити свою позицію на "[0-9]\+ errors". Це буде відповідати, якщо у вас є рядковий звіт> 9 помилок.
Шон Дж. Гофф

Так, вау, я не можу повірити, що пропустив це. Дякую.
Амір Афгані

Шон, висновок здається, що він не підводить мої результати. Виглядає так: Загальні помилки = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
Амір Афгані

8

Це все можна зробити і дивним чином:

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

6

Здається, ви використовуєте систему GNU , тож якщо доступна підтримка регулярних виразів Perl , ви можете написати щось подібне:

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

PS Я змінив регулярний вираз (додав + кількісний показник), щоб дозволити числа> 9.

PS В якості альтернативи, awk є достатнім (якщо припустити GNU awk ):

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

перший для мене просто друкує те, що вже пішло в трубу ...
Xerus

3

Спробуйте підключити вихід з грепа в

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

2

Я використовую це:

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

Це не ефективно для великих списків, але для більшості випадків мого використання це нормально. Зазвичай я використовую функцію оболонки для автоматизації процесу, так що мені потрібно лише вказати ім'я файлу:

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

Ви завжди можете замінити маркер кінця рядка певним роздільником елементів або класом символів, якщо ваші дані обмежені іншим способом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.