Question

j'ai le contenu dans un fichier

comme

asdfb ... 1
adfsdf ... 2
sdfdf ..   3

Je veux écrire une commande unix qui devrait pouvoir ajouter 1 + 2 + 3 et donner le résultat sous la forme 6

D'après ce que je sais, grep et awk seraient utiles, tout indicateur serait utile.

Était-ce utile?

La solution

Je crois que ce qui suit est ce que vous recherchez. Il résumera le dernier champ de chaque enregistrement pour les données lues à partir de stdin.

awk '{ sum += $NF } END { print sum }' < file.txt

Quelques points à noter:

  1. Avec awk, vous n'avez pas besoin de déclarer les variables, elles sont créées en leur attribuant des valeurs.
  2. La variable NF est le nombre de champs de l’enregistrement en cours. En le préfixant par un $, nous traitons sa valeur comme une variable. Au moins, voici comment cela semble fonctionner de toute façon:)
  3. Le bloc END { } n’est valable que lorsque tous les enregistrements ont été traités par les autres blocs.

Autres conseils

Un script awk est tout ce dont vous avez besoin pour cela, car il dispose de grep fonctionnalités intégrées au langage.

Supposons que votre fichier actuel se compose de:

asdfb zz 1
adfsdf yyy 2
sdfdf xx   3

et vous voulez additionner la troisième colonne. Vous pouvez utiliser:

echo 'asdfb zz 1
adfsdf yyy 2
sdfdf xx   3' | awk '
    BEGIN {s=0;}
          {s = s + $3;}
    END   {print s;}'

La clause BEGIN est exécutée avant le traitement des lignes, la clause END après le traitement de toutes les lignes.

L'autre clause se produit pour chaque ligne, mais vous pouvez en ajouter d'autres pour modifier le comportement en fonction de toutes sortes de choses (<=> - py choses).

Ce n'est peut-être pas exactement ce que vous recherchez, mais j'ai écrit un script Ruby rapide pour atteindre votre objectif:

#!/usr/bin/env ruby

total = 0
while gets
    total += $1.to_i if $_ =~ /([0-9]+)$/
end
puts total

En voici un en Perl.

$ cat foo.txt
asdfb ... 1
adfsdf ... 2
sdfdf ..   3

$ perl -a -n -E '$total += $F[2]; END { say $total }' foo
6

Version avec golfée :

perl -anE'END{say$n}$n+=$F[2]' foo
6
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top