Partage
  • Partager sur Facebook
  • Partager sur Twitter

Awk somme de colonnes

Somme des valeurs d'une colonne pour des lignes identiques d'une autre

    14 juin 2022 à 16:22:32

    Bonjour, 

    J'ai à disposition un fichier tsv de la forme :

    Jardins   Arbres   Nombre

    JardinA   Poirier   3

    JardinA   Pommier   1

    JardinA   Ceriser   5

    JardinB   Poirier   6

    JardinB   Pêcher   2

    JardinC   Pommier   2

    J'aimerais pouvoir modifier ce fichier de sorte à avoir :

    JardinA   9

    JardinB   8

    JardinC   2

    donc avoir pour chaque "jardin" le nombre d'arbres toutes "espèces confondues"

    Je dois faire ça en awk mais je n'ai pas la plus grande connaissance de awk et je ne sais pas comment faire. Je connais la commande uniq -c mais ca ne va pas me donner la somme des arbres seulement la somme des lignes. Je serais capable de faire la somme pour chaque jardin individuellement mais mon fichier d'origine contient une quarantaine de "jardins" et une quarantaine d' "espèces".

    • Partager sur Facebook
    • Partager sur Twitter
      14 juin 2022 à 18:20:18

      Bonjour,

      Il suffit d'utiliser un tableau associatif (dictionnaire) avec comme clé le jardin et comme valeur le nombre d'arbre.

      En fait, ça se fait de façon très simple en AWK:

      {
          if (nb_arb_par_jrd[$1]) {
              nb_arb_par_jrd[$1] += $3
          } else {
              nb_arb_par_jrd[$1] = $3
          }
      }
      END {
         for (jrd in nb_arb_par_jrd) {
             print jrd, nb_arb_par_jrd[jrd]
         }
      }

      Il faut retirer l'en-tête du fichier TSV. Avant, pendant ou après traitement, à toi de voir.

      On voudra aussi peut-être afficher les jardins l'ordre alphabétique aussi. Avec gawk, c'est assez simple:

      https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html

      • Partager sur Facebook
      • Partager sur Twitter
        14 juin 2022 à 21:22:42

        plus simple/direct, moins explicite : 
        $ awk 'NR>1 && $1{J[$1]+=$NF}END{for(j in J)print j,J[j]}' /tmp/jardins
        JardinC 2
        JardinA 9
        JardinB 8
        
        mais c'est le même raisonnement.
        • Partager sur Facebook
        • Partager sur Twitter

        Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        Awk somme de colonnes

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown