2009-05-10 7 views
1

j'ai contenu dans un fichierregex unix pour ajouter le contenu dans un fichier

comme

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

Je veux écrire une commande unix qui devrait être en mesure d'ajouter 1 + 2 + 3 et donner le résultat de 6

De ce que je suis conscient que grep et awk serait utile, tous les pointeurs aideraient.

Répondre

4

Je crois que ce qui suit est ce que vous cherchez. 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 choses à noter:

  1. Avec awk vous n'avez pas besoin de déclarer des variables, ils sont voulus l'existence en attribuant des valeurs.
  2. La variable NF est le nombre de champs dans l'enregistrement en cours. En ajoutant un $, nous traitons sa valeur comme une variable. Au moins c'est ainsi que cela semble fonctionner de toute façon :)
  3. Le bloc END { } est seulement une fois que tous les enregistrements ont été traités par les autres blocs.
0

Cela pourrait ne pas être exactement ce que vous cherchez, 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 
1

Un script awk est tout ce dont vous avez besoin pour cela, car il a grep installations construit dans le cadre de la langue.

Disons que votre fichier réel se compose de:

asdfb zz 1 
adfsdf yyy 2 
sdfdf xx 3 

et que vous voulez résumer 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 ajouter plus de clauses pour modifier le comportement en fonction de toutes sortes de choses (grep -py choses).

+1

Il peut être d'utiliser toujours la dernière colonne en changeant 3 $ à $ NF: echo 'asdfb zz 1 adfsdf yyy 2 sdfdf xx 3' | awk 'BEGIN {s = 0;} {s = s + $ NF;} FIN {print s;}' –

+0

Je voulais rester simple, @Matthew, plutôt que de déchaîner tout l'arsenal nucléaire qui est awk :-) peut très bien faire n'importe quoi avec. – paxdiablo

+0

La clause BEGIN est inutile, puisque les variables par défaut à 0 de toute façon.Il n'est pas non plus nécessaire de diviser ceci en plusieurs lignes: awk '{s + = $ 3} FIN {print s}' –

0

En voici une en Perl.

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

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

Golfed Version:

perl -anE'END{say$n}$n+=$F[2]' foo 
6 
Questions connexes