Journal Somme en ligne de commande

Posté par  .
Étiquettes : aucune
0
1
mar.
2004
Salut, journal,

J'ai des fichiers de données assez gros sur lesquels je voudrais appliquer des traitements via quelques scripts dont certains tournent déjà (extraire le min, le max, la médiane sur telle ou telle colonne, etc...). Seulement voilà, je voudrais faire des moyennes aussi, et là pas moyen de trouver un utilitaire en ligne de commande qui me fasse la somme des arguments de l'entrée standard.

Ça existe ?
  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 1.

    Peut etre pas directement mais

    echo " v1 + v2 + v3" | bc -l

    ca peut etre un début si tu arrives a bien formater la ligne de echo :)
  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 1.

    T'as essayé awk ? man awk pour les détails
  • # Re: Somme en ligne de commande

    Posté par  (site web personnel) . Évalué à 1.

    a part bc, ya aussi ... perl, python, php, etc :)
  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 2.

    $(( $a + $b )) ?
  • # Re: Somme en ligne de commande

    Posté par  (site web personnel) . Évalué à 5.

    Bon, forcément, personne n'a proposé LA solution... Alors je m'y colle:
    #!/bin/sh
    
    REP_SORTIE=/tmp/rep_compter
    FICHIER=compter
    
    nbre_entier=0
    
    if [ -e $REP_SORTIE ]
    then
    	echo "Désolé, gros problème technique"
    	exit -1
    fi
    
    mkdir $REP_SORTIE
    
    read ligne
    
    for nb in $ligne
    do
    	for i in `seq 1 $nb` 
    	do
    		touch $REP_SORTIE/$FICHIER-$nbre_entier-$i
    	done
    	nbre_entier=$(($nbre_entier+1))
    done
    
    RESULTAT=`ls -al $REP_SORTIE |wc -l`
    RESULTAT=$(($RESULTAT-3))
    
    echo Résultat: $RESULTAT
    rm -rf $REP_SORTIE
    exit 0
    
    Tout en bash... Que du bonheur... Autant utiliser le disque dur, au lieu de faire tourner un gros programme comme python ou php ;) Je sort? Ok, je sort ------->[]
    • [^] # Re: Somme en ligne de commande

      Posté par  . Évalué à 2.

      Ma solution tout en bash un poil plus court et sans doute plus propre.
      Seules contraintes à vérifier : le nombre d'arguments max que l'on peut passer en bash et le dépassement de capacité de $SUM

      #! /bin/sh

      SUM=0

      # Tant qu'on n'a pas scanné tous les arguments, on continue
      while [ "$#" -gt "0" ]
      do
      # On ajoute l'argument courant au résultats
      SUM=$(($SUM+$1))

      # On décale les arguments vers la gauche
      shift
      done

      echo "Somme : $SUM"
      • [^] # Re: Somme en ligne de commande

        Posté par  . Évalué à -1.

        bash version 3 mini

        (ce n'est pas la version standard sur woody et solaris 2.8)
        • [^] # Re: Somme en ligne de commande

          Posté par  . Évalué à 0.

          Ha bon ? Qu'est-ce qui ne devrait pas fonctionner ?
          Parceque j'ai testé ce script sur ma woody avant de le poster ici, et il semblait fonctionner au poil.
          La nuance se fait ptet dans des conditions "extèmes" ?
          • [^] # Re: Somme en ligne de commande

            Posté par  . Évalué à 0.

            mea culpa, c'est bash 2.05 mini ..

            solaris : bash --version
            GNU bash, version 2.03.0(1)-release (sparc-sun-solaris)
            Copyright 1998 Free Software Foundation, Inc.

            > ./dd.sh 1 2 3
            ./dd.sh: syntax error at line 9: `SUM=$' unexpected


            linux woody : bash --version
            GNU bash, version 2.05a.0(1)-release (i386-pc-linux-gnu)
            Copyright 2001 Free Software Foundation, Inc.

            ./dd.sh 1 2 3
            Somme : 6
            • [^] # Re: Somme en ligne de commande

              Posté par  . Évalué à 0.

              Le probleme ne vient pas de la version de bash.
              En effet, le script doit etre interprété avec le Bourne shell (/bin/sh)
              Or sous Linux /bin/sh est un lien symbolique vers /bin/bash (le BASH), alors que sous solaris c'est vraiment /bin/sh qui interprète le script. Or le Bourne Shell ce n'est pas la meme chose que le Bash.

              Tout devrait donc rentrer dans l'ordre en remplacant /bin/sh par /bin/bash.

              P.S: Je ne suis pas du tout sur de ce que je raconte. Je n'ai pas de Solraris sous la main là.
      • [^] # Commentaire supprimé

        Posté par  . Évalué à 0.

        Ce commentaire a été supprimé par l’équipe de modération.

  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 2.

    | perl -e '$s=0;while(){$s+=$_}print "$s\n"'
  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 0.

    Sinon il existe syncsort qui est tres impressionnant

    Mais bon capucépolibre (mais c'est quand même tres impressionnant)

    http://www.syncsort.com/(...)

    Dam
  • # Re: Somme en ligne de commande

    Posté par  (site web personnel) . Évalué à 0.

    #!/usr/bin/env ruby

    s=0
    while gets
        s += $_
    end
    print s, "\n"

    (de memoire de debutant)
  • # Ruby rulez !!!

    Posté par  . Évalué à 0.

    Mes deux solutions en Ruby.

    cedric@follc:~/tmp$ cat toto
    1
    2
    3
    4
    12

    Number one:

    cedric@follc:~/tmp$ ruby -e 'puts eval($stdin.gets(nil).split("\n").join("+"))' < toto
    22

    Number two:
    cedric@follc:~/tmp$ ruby -e 's=0;while gets do s += $_.to_i end;puts s' < toto
    22
    • [^] # Re: Ruby rulez !!!

      Posté par  . Évalué à 0.

      J'ai oublié de dire que la première était bcp moins performante sur un gros fichier et que Ruby bossait par defaut en multi-précision:

      cedric@follc:~/tmp$ ruby -e 'for i in 1..100000;puts rand(10000000000000000);end' > toto
      cedric@follc:~/tmp$ time ruby -e 's=0;while gets do s += $_.to_i end;puts s' < toto
      499355529220014254738

      real 0m1.828s
      user 0m1.780s
      sys 0m0.000s


      Oui, je sais ça calme ;-)
  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 0.

    Peut-être expr ?
  • # Avec awk en une ligne ...

    Posté par  . Évalué à 1.

    ***lucas@blop:~$ cat toto |awk '{ s+= $1 } END { print s }'
    21
  • # Re: Somme en ligne de commande

    Posté par  . Évalué à 1.

    Wow, merci à tous, je n'ai plus que l'embarras du choix...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.