151 votes

Réorganiser les colonnes en utilisant la coupe

Je vais avoir un fichier dans le format suivant

Colonne1 Colonne2
str1 1
str2 2
str3 3

Je veux que les colonnes soient réarrangées. J'ai essayé en dessous de la commande

couper -f2,1 fichier.txt

La commande ne réorganise pas les colonnes. Une idée pourquoi ça ne marche pas?

Je vous remercie.

169voto

Ignacio Vazquez-Abrams Points 312628

Pour la page de manuel cut(1) :

Utilisez un et un seul parmi -b, -c ou -f. Chaque liste est composée d’une ou de plusieurs plages séparées par des virgules. L'entrée sélectionnée est écrite dans le même ordre que celui où elle est lue et est écrite exactement une fois.

Il atteint le champ 1 en premier, il est donc imprimé, suivi du champ 2.

Utilisez awk place:

 awk '{ print $2 " " $1}' file.txt
 

66voto

Justin Kaeser Points 504

Vous pouvez également combiner cut et paste :

 paste <(cut -f2 file.txt) <(cut -f1 file.txt)
 

Je me demande cependant si l’argument redondant file peut être évité intelligemment.

7voto

ghostdog74 Points 86060

en utilisant seulement la coquille,

 while read -r col1 col2
do
  echo $col2 $col1
done <"file"
 

7voto

Met Points 84

Vous pouvez utiliser Perl pour que:

perl -ane 'print "$F[1] $F[0]\n"' < file.txt
  • l'option-e signifie l'exécution de la commande après
  • -n signifie lire ligne par ligne (ouvrir le fichier, dans ce cas, STDOUT, et de la boucle sur les lignes)
  • -un moyen de diviser ces lignes à un vecteur appelé @F ("F" - comme le Champ). Perl indices des vecteurs à partir de 0 contrairement à couper les index des champs à partir de 1.
  • Vous pouvez ajouter -F modèle (sans espace entre F et modèle) pour utiliser le modèle comme un séparateur de champ lors de la lecture du fichier au lieu de la valeur par défaut des espaces

L'avantage de l'exécution de perl, c'est que (si vous connaissez Perl), vous pouvez faire beaucoup plus de calculs sur F que de modifier des colonnes.

3voto

Chris Rymer Points 398

Je viens de travailler sur quelque chose de très similaire, je ne suis pas un expert, mais je pensais partager les commandes que j'avais utilisées. J'avais un csv multi-colonnes dont je n'avais besoin que de 4 colonnes et puis je devais les réorganiser.

Mon fichier était pipe '|' délimité mais qui peut être échangé.

 LC_ALL=C cut -d$'|' -f1,2,3,8,10 ./file/location.txt | sed -E "s/(.*)\|(.*)\|(.*)\|(.*)\|(.*)/\3\|\5\|\1\|\2\|\4/" > ./newcsv.csv
 

Certes, c'est vraiment difficile et prêt, mais cela peut être peaufiné!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X