Forçage de l'ordre des champs de sortie à partir de la commande cut
-
10-07-2019 - |
Question
Je veux faire quelque chose comme ça:
cat abcd.txt | cut -f 2,1
et je veux que l'ordre soit 2 puis 1 dans la sortie. Sur la machine que je teste (FreeBSD 6), cela ne se produit pas (son impression est effectuée dans l'ordre 1,2). Pouvez-vous me dire comment faire cela?
Je sais que je peux toujours écrire un script shell pour effectuer cette inversion, mais je cherche quelque chose en utilisant les options de la commande "couper".
Je pense utiliser la version 5.2.1 de coreutils contenant cut.
La solution
Cela ne peut pas être fait avec cut
. Selon la page de manuel:
L’entrée sélectionnée est écrite dans le même ordre de lecture, et est écrit exactement une fois.
La correction de coupé
a été proposé de nombreux fois , mais même les correctifs complets ont été rejetés .
À la place, vous pouvez le faire avec awk
, comme ceci:
awk '{print($2,"\t",$1)}' abcd.txt
Remplacez \ t
par tout ce que vous utilisez comme séparateur de champ.
Autres conseils
La réponse de Lars était excellente mais j’en ai trouvé une meilleure. Le problème avec son est qu'il ne correspond à aucune colonne. Pour résoudre ce problème, utilisez ce qui suit:
awk -v OFS=" " -F"\t" '{print $2, $1}' abcd.txt
Où:
-F "\ t"
correspond à ce qu'il faut couper sur exactement (onglets).
-v OFS = " "
" est ce qu'il faut séparer (deux espaces)
Exemple:
echo 'A\tB\t\tD' | awk -v OFS=" " -F"\t" '{print $2, $4, $1, $3}'
Cette sortie:
B D A