Скрипт bash для суммирования числового результата - PullRequest
1 голос
/ 21 апреля 2011

Я хотел бы написать сценарий Bash, который сообщает сумму.Я начинаю с 20 текстовых файлов, в которых где-то есть текст «LOC: 54» («54» может быть любым целым числом).Итак, вот результаты поиска этой строки с помощью grep:

# grep LOC *
ceil.c: * LOC: 38
count_newlines.c: * LOC: 28
even.c: * LOC: 35
every_product.c: * LOC: 48
expand_factors.c: * LOC: 54
factor.c: * LOC: 41
fibonacci.c: * LOC: 49
get_element.c: * LOC: 37
is_composite.c: * LOC: 43
isprime.c: * LOC: 36
largest.c: * LOC: 37
max_product.c: * LOC: 68
mult_list.c: * LOC: 38
nlist.c: * LOC: 37
palindrome.c: * LOC: 72
prime_factors.c: * LOC: 57
remove_dups.c: * LOC: 50
select_products.c: * LOC: 36
square_list.c: * LOC: 31
sum_list.c: * LOC: 38

Что я могу сделать, чтобы собрать только числовую информацию, чтобы получить одно число, сумму вышеуказанных чисел?Я считаю, что в приведенном выше примере это будет 873.

Ответы [ 5 ]

5 голосов
/ 21 апреля 2011
awk -F: '/LOC/ {sum += $3;} END {print sum;}' InputFileName
1 голос
/ 22 апреля 2011

Это чистый скрипт bash. Не работает с числами с плавающей запятой, хотя

#!/bin/bash


shopt -s nullglob
declare -i sum=0
for file in file*
do
    if [ -f "$file" ];then
    while read -r line
    do
        case "$line" in
            *"LOC: "* )
            [[ $line =~ "LOC: ([0-9]+)" ]]
            ((sum+=${BASH_REMATCH[1]}))
            ;;
        esac
    done < "$file"
    fi
done
echo "Sum: $sum"
0 голосов
/ 22 апреля 2011

Просто упражнение, а не лучшее решение

set -- $(awk '/LOC:/ {print $NF}' filename)
IFS='+'
answer=$( echo "$*" | bc )
0 голосов
/ 21 апреля 2011

Чистый Баш. Следующий скрипт sum.sh делает это:

declare sum=0
while read -a line ; do
  (( sum += ${line[@]: -1} ))               # sum up last elements
done < <(grep --exclude=*.sh LOC *)         # exclude script files
echo -e "sum = $sum"
0 голосов
/ 21 апреля 2011

Этот скрипт awk добавит те строки, которые содержат LOC:, и оканчивается числом:

 grep LOC * | awk 'BEGIN { FS= "LOC: "; sum = 0 } NF==2 && /[0-9]+$/ { sum+=$2 } END { print sum }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...