Forum Programmation.shell awk et les colonnes

Posté par  . Licence CC By‑SA.
Étiquettes :
0
5
juil.
2014

Bonjour,

J'ai un fichier avec de nombreuses lignes qui ont toutes la même longueur, quelques caractères. Je souhaite mettre le contenu de ce fichier sur plusieurs colonnes. J'ai trouvé cette solution qui me convient :

awk 'NR%9==1{print " "}{printf "%s %s %s %s %s %s %s %s %s",$1, $2, $3, $4, $5, $6, $7, $8, $9}' input > output

pour neuf colonnes.

Je vous sollicite pour deux questions :

  1. Est-ce que cela peut s'écrire plus proprement ?

  2. Avec ma solution on a les éléments du fichier d'origine qui se suivent « en ligne », comment peut-on faire pour qu'ils se suivent « en colonne » ?

Par exemple pour obtenir :

1 4 7
2 5 8
3 6 9

au lieu de :

1 2 3
4 5 6
7 8 9
  • # Inverser les lignes/colonnes avec awk

    Posté par  . Évalué à 5.

    Bonjour,

    Si tu veux inverser les lignes et les colonnes, il va falloir commencer par lire l'ensemble du fichier et le stocker dans une table, par exemple:

    {
      for (i = 1; i <= NF; i++) {
        array[NR, i] = $i;
      }
      max_col = max(max_col, NF);
    }

    Tu vas te retrouver avec tous les champs séparés dans le tableau array, et au passage on garde le nombre de champs pour la ligne qui en as le plus, car cela donnera le nombre de lignes a générer.

    Une fois que tu as les valeurs, il ne reste donc plus qu'a les ressortir dans l'ordre que tu veux, dans cet exemple:

    END {
      for (y = 1; y <= max_col; y++) {
        printf "%s", array[1, y];
        for (x = 2; x <= NR; x++) {
          printf " %s", array[x, y];
        }
        printf "\n";
      }
    }

    Attention, pour que tout fonctionne il faut savoir que (g)awk ne définit pas la fonction max, donc c'est à toi de le faire en rajoutant ceci au début:

    function max(a, b) {
      if (a > b) { return a; } else { return b; }
    }

    Enfin, si tu souhaites prendre l'habitude de faire du code explicite, pour être plus facile à reprendre plus tard et avec moins de risque de bugs, je t'invite à initialiser explicitement les variables, ce qui se fait ainsi:

    BEGIN {
      max_col = 0;
    }

    Voila, une fois tout ceci remis dans l'ordre, chez-moi-ça-marche.

Suivre le flux des commentaires

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