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.
Posté par norbs .
É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
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.
# finalement j'ai trouvé :
Posté par Taud . Évalué à 2.
finalement j'ai trouvé :
awk -F/ '{print $2 $1 $3}' toto > tata
# inversées mais collées
Posté par Taud . É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 wismerhill . É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 Taud . É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 norbs . É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 wismerhill . É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 fearan . É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 norbs . É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 wismerhill . Évalué à 2.
C'est assez facile à modifier pour inclure un nombre quelconque de colonne (la variable NF est là pour ça).
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.