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) ?
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) ?
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
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
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.
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 }'
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
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.