bcavec un peu d'aide 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, passez le grepSTDOUT du au STDIN de paste:
grep ....| paste -sd+| bc
Exemple:
% cat file.txt
13414312% paste -sd+ file.txt | bc
19% grep . file.txt | paste -sd+| bc
19
Si vous devez utiliser bash, alors vous pouvez utiliser un tableau pour enregistrer le contenu du fichier et ensuite parcourir les éléments ou vous pouvez lire le fichier ligne par ligne et faire la somme pour chaque ligne, la deuxième 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
Hmm, sympa. Désolé de changer la question: pourrais-je le modifier pour accepter la sortie grep (ou en faire une ligne comme cat file.txt | bc?
Tim
@Tim Vérifiez mes modifications
heemayl
Ta, c'était simple!
Tim
2
la méthode stdin n'a pas fonctionné pour moi jusqu'à ce que je découvre dans une autre réponse que je devais utiliser paste -sd+ -. Veuillez modifier cela.
Xerus
19
Vous pouvez également utiliser awk. Pour compter le nombre total de lignes dans les fichiers * .txt qui contiennent le mot "bonjour":
Mais si cette ligne a la valeur "4", elle ne comptera pas 4. Il comptera 1.
Tim
Non, ça comptera 4.
CrazyApe84
Je veux le total des nombres dans un fichier. Est-ce que cela fait ça?
Tim
Je pensais que vous aviez changé votre question en sortie de grep. Je faisais quelques suppositions. J'ajouterai comment additionner simplement les valeurs dans un fichier.
CrazyApe84
2
Ouais. C'est vraiment la même réponse que celle de heemayl, mais au lieu de coller et bc, il utilise awk, ce qui donne finalement beaucoup plus de flexibilité. Pourtant, sa réponse est bonne et il était le premier donc il mérite votre vote!
La commande numsumfait exactement ce dont vous avez besoin par défaut;
$ numsum file.txt
19
Lecture des numéros de test ligne par ligne à partir de stdin:
$ printf '
1
3
4
1
4
3
1
2'| numsum
19
Ou en lisant une ligne:
$ printf '1 3 4 1 4 3 1 2'| numsum -r
19
Plus d'utilitaires
Le package contient quelques 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 de calculatrice plus générale numprocess,
qui applique une expression de la ligne de commande aux nombres sur les lignes d'entrée.
Vous pouvez utiliser awkune application Linux native utile pour numériser et traiter des fichiers avec un modèle 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 }'
Il est redondant à ce problème mais j'ai préféré l'inclure en raison d'un objectif didactique.
gwarah
Mais qu'est-ce que ça enseigne? Il est redondant pour chaque problème, awkn'est pas C, vous n'avez pas besoin de définir une variable avant de l'utiliser. Essayez awk 'BEGIN{print c+=1}'.
terdon
BEGIN {}Le bloc n'a pas été conçu uniquement pour initialiser des variables. Il participe aux spécifications de conception. Donc, sur certains problèmes, cela pourrait être nécessaire.
gwarah
0
Il s'agit d'une utilisation assez simple des bashscripts.
SUM=0;for line in`cat file.txt`;do SUM=$((SUM + line));done
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
méthode.Réponses:
bc
avec un peu d'aidepaste
pour obtenir les lignes en une seule avec+
comme séparateur:Pour utiliser la sortie de
grep
(ou toute autre commande) à la place d'un fichier statique, passez legrep
STDOUT du au STDIN depaste
:Exemple:
Si vous devez utiliser
bash
, alors vous pouvez utiliser un tableau pour enregistrer le contenu du fichier et ensuite parcourir les éléments ou vous pouvez lire le fichier ligne par ligne et faire la somme pour chaque ligne, la deuxième approche serait plus efficace:la source
cat file.txt | bc
?paste -sd+ -
. Veuillez modifier cela.Vous pouvez également utiliser awk. Pour compter le nombre total de lignes dans les fichiers * .txt qui contiennent le mot "bonjour":
Pour simplement additionner les nombres dans un fichier:
la source
À utiliser
numsum
dans l'emballagenum-utils
!(Vous devrez peut-être
sudo apt-get install num-utils
)La commande
numsum
fait exactement ce dont vous avez besoin par défaut;Lecture des numéros de test ligne par ligne à partir de
stdin
:Ou en lisant une ligne:
Plus d'utilitaires
Le package contient quelques autres utilitaires pour le traitement des nombres qui méritent d'être mieux connus:
et une commande de calculatrice plus générale
numprocess
,qui applique une expression de la ligne de commande aux nombres sur les lignes d'entrée.
la source
Vous pouvez utiliser
awk
une application Linux native utile pour numériser et traiter des fichiers avec un modèle par ligne. Pour votre question, cela produira ce que vous voulez:Les tuyaux sont également acceptés:
la source
BEGIN{}
bloc, voir la réponse de CrazyApe84 .awk
n'est pas C, vous n'avez pas besoin de définir une variable avant de l'utiliser. Essayezawk 'BEGIN{print c+=1}'
.BEGIN {}
Le bloc n'a pas été conçu uniquement pour initialiser des variables. Il participe aux spécifications de conception. Donc, sur certains problèmes, cela pourrait être nécessaire.Il s'agit d'une utilisation assez simple des
bash
scripts.la source
Solution Perl:
Ce qui précède peut additionner tous les nombres sur plusieurs fichiers:
Pour plusieurs fichiers donnés en ligne de commande où nous voulons voir la somme des nombres dans un fichier individuel, nous pouvons le faire:
la source
Simple -
additionne les chiffres et vous donne le total.
la source
Une approche simple consiste à utiliser une fonction intégrée de votre shell:
Cela lit votre fichier en ligne, résume et imprime le résultat.
Si vous souhaitez utiliser un tuyau et utiliser uniquement la 1ère ligne, cela fonctionne comme ceci:
Obtenir le premier élément se fait comme ceci:
la source