Chaque ligne contient du texte et des nombres dans une colonne. J'ai besoin de calculer la somme des nombres dans chaque ligne. Comment puis je faire ça? THX
example.log contient:
time=31sec
time=192sec
time=18sec
time=543sec
La réponse devrait être 784
Réponses:
Si votre option de
grep
support-o
, vous pouvez essayer:POSIX:
la source
Avec une version plus récente (4.x) de GNU
awk
:Avec d'autres,
awk
essayez:la source
s+0
dans le cas oùs
est vide, il s'imprimera0
au lieu de vide.s
peut être vide; si les données d'entrée ne contiennent pas de lignes (c'est-à-dire s'il n'y a pas d'entrée du tout ). Dans ce cas, deux comportements sont possibles; 1) pas d'entrée => pas de sortie, ou 2) toujours sortir quelque chose, si seulement 0. Les deux sont des options sensées selon le contexte de l'application. L'+0
adresse concerne l'option 2). Pour répondre à l'option 1), vous devriez plutôt écrireEND {if(s) print s}
. - Par conséquent, cela n'a aucun sens de supposer l'une ou l'autre option (pour ce cas de coin sans données) jusqu'à ce qu'elle soit spécifiée par la question.la source
time=1.4e5sec
Un autre GNU
awk
:Un
perl
:UN POSIX:
la source
la source
sed
awk --field-separator = '{ sum+=$2 } END { print sum}' data.dat
-F'='
au lieu de--field-separator =
man awk
seul donne-F fs
et--field-separator fs
-F'='
ou-F '='
sont 2 façons de faire-F fs
(fs est "=" dans votre cas). J'ai ajouté les guillemets simples pour m'assurer que le fs est correctement vu et interprété par awk, pas le shell (utile si le fs est ';' par exemple)Vous pouvez essayer ceci:
la source
Tout le monde a posté des
awk
réponses impressionnantes , que j'aime beaucoup.Une variation de @cuonglm remplaçant
grep
parsed
:sed
bandes tout sauf les chiffres.paste -sd+ -
commande joint toutes les lignes en une seule lignebc
évalue l'expressionla source
Vous devez utiliser une calculatrice.
Avec vos quatre lignes qui impriment:
Et plus simplement:
... qui imprime ...
Si la vitesse est ce
dc
que vous recherchez, c'est ce que vous voulez. Il s'agissait traditionnellementbc
du compilateur - et l'est toujours pour de nombreux systèmes.la source
dc
aussi près que je peux dire. Qu'est-ce que tu racontes?perl
ensemble d'outils Unix standard - cela n'a vraiment pas beaucoup de sens si vous utilisez des outils GNU compilés sur une chaîne d'outils GNU. Tous les ballonnements qui peuvent affecter négativement les performances de Perl se trouvent également dans tous ces utilitaires GNU compilés par GNU. Triste mais vrai. Vous avez besoin d'un ensemble d'outils réel, simple et simple pour évaluer avec précision la différence. Comme un ensemble d'outils héritage lié statiquement aux bibliothèques musl par exemple - de cette façon, vous pouvez comparer le paradigme un outil / un travail par rapport à celui un outil pour les gouverner tous.Grâce à python3,
la source
re.findall
renvoie une liste de chaînes, cela ne fonctionnera passum(int(e) for e in l)
- être plus pythonique.Solution Pure Bash (Bash 3+):
Version courte:
la source
PS4='$((x+=${time%s*}))' time=0 x=0 sh -x <infile