regex unix pour ajouter du contenu dans un fichier
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.
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:
- Avec awk, vous n'avez pas besoin de déclarer les variables, elles sont créées en leur attribuant des valeurs.
- 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:) - 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
perl -anE'END{say$n}$n+=$F[2]' foo
6