2009-06-24 8 views
25

Je veux faire quelque chose comme ceci:Obliger l'ordre des champs de sortie de commande de coupe

cat abcd.txt | cut -f 2,1 

et je veux l'ordre d'être 2 et 1 dans la sortie. Sur la machine que je suis en train de tester (FreeBSD 6), cela ne se produit pas (impression en ordre 1,2). Pouvez-vous me dire comment faire cela?

Je sais que je peux toujours écrire un script shell pour faire cette inversion, mais je cherche quelque chose en utilisant les options de commande 'cut'.

Je pense que j'utilise la version 5.2.1 de coreutils contenant cut.

Répondre

27

Cela ne peut pas être fait en utilisant couper. Selon la page de manuel:

L'entrée sélectionnée est écrite dans le même ordre que celui qui est lu, et est écrite exactement une fois.

Au lieu de cela, vous pouvez le faire en utilisant awk, comme ceci:

awk '{print($2,"\t",$1)}' abcd.txt 

Remplacer le \ t avec tout ce que vous utilisez comme séparateur de champ.

11

La réponse de Lars était géniale mais j'en ai trouvé une encore meilleure. Le problème avec son est qu'il correspond à \ t \ t comme aucune colonne. Pour résoudre ce problème utilisez les touches suivantes:

awk -v OFS=" " -F"\t" '{print $2, $1}' abcd.txt 

Où:

-F"\t" est quoi couper le exactement (onglets).

-v OFS=" " est quoi séparée avec (deux espaces)

Exemple:

echo 'A\tB\t\tD' | awk -v OFS=" " -F"\t" '{print $2, $4, $1, $3}' 

Ce sorties:

B D A  
+1

En Cygwin j'ai dû remplacer -F "\ t" avec - F \ t pour faire ce travail. –