• # finalement j'ai trouvé :

    Posté par  . Évalué à 2.

    finalement j'ai trouvé :

    awk -F/ '{print $2 $1 $3}' toto > tata

  • # inversées mais collées

    Posté par  . Évalué à 2.

    non en fait ca marche avec

    awk '{print $2 $1 $3}' toto > tata

    mais mes colonnes se retrouvent non séparées (i-e collées) any idea?

    comment ne pas perdre l'espace séparateur de colonnes ?

    • [^] # Re: inversées mais collées

      Posté par  . Évalué à 3.

      Met une virgule entre les différents arguments de print, il les considérera ainsi comme des champs différents et intercalera le séparateur de champ de sortie (OFS, qui est un espace par défaut).

      Dans le langage awk, l'espace est en fait l'opérateur de concaténation, c'est pour ça que tu n'avais aucun séparateur en sortie.

  • # cette fois ci c’est la bonne

    Posté par  . Évalué à 6.

    ok bon finalement cette commande est la bonne

    awk -F\ '{print $2" "$1" "$3}' toto > tata

  • # alternative avec cut et paste

    Posté par  . Évalué à 1. Dernière modification le 14 juin 2016 à 23:41.

    paste -d ' ' <(cut -d ' ' -f2 toto) <(cut -d ' ' -f1 toto) <(cut -d ' ' -f3- toto) > tata

    • [^] # Re: alternative avec cut et paste

      Posté par  . Évalué à 2.

      Pas terrible question efficacité, puisque tu lance trois sous-shells, trois processus cut et un paste.

      Sinon, on peut aussi s'amuser avec sed, et son option -i si on n'a pas peur de perdre ses données

      sed -ri 's/^([^ ]+) +([^ ]+) /\2 \1 /' fichier_en_colonnes.txt

      (et si on a quand même un peu peur, on ajoutera un suffixe à l'option -i pour préserver la version précédente du fichier)

      • [^] # Re: alternative avec cut et paste

        Posté par  . Évalué à 2.

        même si ce n'es pas terrible ça a le mérite de donner une commande trop peu connue (par exemple je ne la connaissais pas)

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: alternative avec cut et paste

        Posté par  . Évalué à 2. Dernière modification le 16 juin 2016 à 00:22.

        Il y a quand même des avantages à la version cut et paste :
        - elle est lisible
        - au contraire de la version awk elle gère un nombre quelconque de colonnes
        - elles permet d'utiliser les options de cut sans entrer dans les arcanes de awk, ou les regexp complexes

        et niveau efficacité (sur un fichier de 1 000 000 lignes), elle fait mieux que les versions sed ou awk :

        $ time awk -F" " '{print $2" "$1" "$3}' toto > tata

        real 0m0.363s
        user 0m0.312s
        sys 0m0.020s
        $ time sed -r 's/[^ ]+ +([^ ]+) /\2 \1 /' toto > tata

        real 0m2.494s
        user 0m1.348s
        sys 0m0.156s
        $ time paste -d ' ' <(cut -d ' ' -f2 toto) <(cut -d ' ' -f1 toto) <(cut -d ' ' -f3- toto) > tata

        real 0m0.137s
        user 0m0.320s
        sys 0m0.024s

        • [^] # Re: alternative avec cut et paste

          Posté par  . Évalué à 2.

          • au contraire de la version awk elle gère un nombre quelconque de colonnes

          C'est assez facile à modifier pour inclure un nombre quelconque de colonne (la variable NF est là pour ça).

          et niveau efficacité (sur un fichier de 1 000 000 lignes), elle fait mieux que les versions sed ou awk :

          Non, ou plus exactement ton test ne permet pas de conclure, car tu n'a mesure que l'exécution de paste, les trois sous-shell avec leurs instances de cut se sont exécuté en parallèle.
          Ça peut être une façon intéressante de profiter d'un CPU multi-cœur, mais si tu n'a qu'un cœur CPU ça fait beaucoup plus de changements de contexte ce qui est assez mauvais pour les performances.

Suivre le flux des commentaires

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