J'ai un fichier qui ressemble à ceci:
1
3
4
1
4
3
1
2
Comment puis-je trouver le total de ceci (c'est-à-dire 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?
bc
avec un peu d'aide 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, transmettez le STDOUT de grep
au nom de STDIN de paste
name__:
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
name__, vous pouvez utiliser un tableau pour enregistrer le contenu du fichier, puis parcourir les éléments ou lire le fichier ligne par ligne et faire la somme de chaque ligne. La seconde approche serait 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
Vous pouvez aussi utiliser awk. Pour compter le nombre total de lignes dans *. Txt fichiers contenant le mot "hello":
grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'
Pour additionner simplement les nombres dans un fichier:
awk '{n += $1}; END{print n}' file.txt
numsum
à partir du package num-utils
!(Vous devrez peut-être 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 en lisant sur une 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 la calculatrice numprocess
,
qui applique une expression de la ligne de commande aux nombres figurant sur les lignes de saisie.
Vous pouvez utiliser awk
, une application linux native utile pour analyser et traiter les 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 pipes sont aussi acceptées:
cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'
Solution Perl:
$ Perl -lnae '$c+=$_;END{print $c}' input.txt
19
Ce qui précède peut additionner tous les nombres de plusieurs fichiers:
$ Perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt
34
Pour plusieurs fichiers donnés en ligne de commande où nous voulons voir la somme des nombres dans un fichier individuel, 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
Il s’agit d’une utilisation assez simple du script bash
.
SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
Simple -
awk '{total+=$1} END{print total}' file
additionne les nombres et te donne le total.