52 votes

Comment additionner les nombres sur les lignes d'un fichier ?

J'ai un fichier qui ressemble à ceci :

1
3
4
1
4
3
1
2

Comment puis-je trouver le total (c'est-à-dire 1+3+4+1+4+3+1+2 = 19) ?

76voto

heemayl Points 85741

bc avec un peu d'aide de la part de paste pour obtenir les lignes en une seule avec + comme séparateur :

paste -sd+ file.txt | bc

Pour utiliser la sortie de grep (ou toute autre commande) à la place d'un fichier statique, passez la commande grep vers le STDIN de l'application paste :

grep .... | paste -sd+ | bc

Exemple :

% cat file.txt            
1
3
4
1
4
3
1
2

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

Si vous devez utiliser bash Vous pouvez alors utiliser un tableau pour enregistrer le contenu du fichier, puis itérer sur les éléments, ou vous pouvez lire le fichier ligne par ligne et faire la somme pour chaque ligne, la deuxième approche étant plus efficace :

$ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
19

real    0m0.002s
user    0m0.000s
sys 0m0.000s

$ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
19

real    0m0.000s
user    0m0.000s
sys 0m0.000s

24voto

CrazyApe84 Points 882

Vous pouvez également utiliser awk. Pour compter le nombre total de lignes dans *.txt qui contiennent le mot "hello" :

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

Pour additionner simplement les chiffres d'un fichier :

awk '{n += $1}; END{print n}' file.txt

15voto

Volker Siegel Points 12033

Utilisation numsum du paquet num-utils !

(Il se peut que vous deviez sudo apt-get install num-utils )

La commande numsum fait exactement ce dont vous avez besoin par défaut ;

$ numsum file.txt 
19

Lire les numéros de test ligne par ligne à partir de stdin :

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

Ou la lecture d'une seule ligne :

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19

Plus d'utilitaires

Le paquet contient d'autres utilitaires pour le traitement des nombres qui méritent d'être mieux connus :

numaverage   - find the average of the numbers, or the mode or median
numbound     - find minimum of maximum of all lines
numgrep      - to find numbers matching ranges or sets
numinterval  - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom    - random numbers from ranges or sets, eg odd.  
numrange     - similar to seq
numround     - round numbers up, down or to nearest

et une commande plus générale de calculatrice numprocess ,
qui applique une expression de la ligne de commande aux nombres des lignes d'entrée.

3voto

gwarah Points 273

Vous pouvez utiliser awk , une application native linux utile pour scanner et traiter des fichiers avec un motif par ligne. Pour votre question, cela produira ce que vous voulez :

awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt

Les tuyaux sont également acceptés :

cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'

2voto

Sergiy Kolodyazhnyy Points 97292

Solution Perl :

$ perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
19

La méthode ci-dessus permet d'additionner tous les chiffres de plusieurs fichiers :

$ perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
34

Pour plusieurs fichiers donnés en ligne de commande et pour lesquels nous voulons voir la somme des nombres dans chaque fichier, nous pouvons faire ceci :

$ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X