web-dev-qa-db-fra.com

Comment puis-je additionner des nombres sur des 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 de ceci (c'est-à-dire 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?

18
Tim

bcavec un peu d'aide de pastepour 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 grepau nom de STDIN de pastename__:

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 bashname__, 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
35
heemayl

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
15
CrazyApe84

Utilisez 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


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 la calculatrice numprocess,
qui applique une expression de la ligne de commande aux nombres figurant sur les lignes de saisie.

5
Volker Siegel

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 }'
1
gwarah

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
0

Il s’agit d’une utilisation assez simple du script bash.

SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done
0
zomfg_zombie

Simple -

awk '{total+=$1} END{print total}' file

additionne les nombres et te donne le total.

0
Sufyan Ramzan