2011-04-21 7 views
1

Je voudrais écrire un script Bash qui rapporte une somme. Je commence avec 20 fichiers texte qui ont le texte "LOC: 54" quelque part en eux (le "54" pourrait être un nombre entier). Voici donc les résultats de la recherche de cette ligne avec grep:bash Script pour additionner la sortie numérique

# 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 

Que pouvais-je faire pour tirer uniquement les informations numériques ensemble pour produire un seul numéro, la somme des chiffres ci-dessus? Je crois dans l'exemple ci-dessus, il serait 873.

Répondre

5
awk -F: '/LOC/ {sum += $3;} END {print sum;}' InputFileName 
+0

Vous avez obtenu 873 comme somme. –

+0

Oui c'est correct, 873, j'ai mis à jour ma question, merci. – dvanaria

+0

Comment cela fonctionne-t-il? Il ne cherche pas le texte spécifique "LOC" – dvanaria

0

Ce script awk ajoutera les lignes qui contiennent LOC:, et se terminent par un numéro:

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

Bash pur. Le script suivant sum.sh le fait:

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

vous avez 'grep' :). bash pas vraiment pur –

0

Juste un exercice, pas la meilleure solution

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

Ceci est un pur script bash. Ne fonctionne pas avec les nombres à virgule flottante bien que

#!/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" 
Questions connexes