2011-04-21 86 views
1

我想編寫一個Bash腳本來報告總和。我從20個文本文件開始,其中有文本「LOC:54」(「54」可以是任何整數)。因此,這裏有尋找使用grep此行的結果:bash腳本總和數值輸出

# 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
awk -F: '/LOC/ {sum += $3;} END {print sum;}' InputFileName 
+0

得到873作爲總和。 – 2011-04-21 17:05:31

+0

是的,這是正確的,873,我更新了我的問題,謝謝。 – dvanaria 2011-04-21 17:12:03

+0

這是如何工作的?它不是在尋找具體的文字「LOC」 – dvanaria 2011-04-21 17:13:32

0

awk腳本將添加那些包含LOC:線,並結束與一個數字:

grep LOC * | awk 'BEGIN { FS= "LOC: "; sum = 0 } NF==2 && /[0-9]+$/ { sum+=$2 } END { print sum }' 
0

純猛砸。下面的腳本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

你有'grep' :)。不是真正純粹的bash – 2011-04-21 23:07:13

0

只是一個鍛鍊,而不是最好的解決辦法

set -- $(awk '/LOC:/ {print $NF}' filename) 
IFS='+' 
answer=$(echo "$*" | bc) 
1

這是一個純粹的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"