85 votes

Utilisation de la commande cut pour supprimer plusieurs colonnes

Entrée donnée

 echo 1,2,3,4,5,6,7,8,9,...100 

Si je veux réduire les colonnes 5, je peux faire ce qui suit

cut -d, -f-4,6-

Que faire si je veux couper plusieurs colonnes non consécutives comme 5, 7, etc. Y a-t-il une solution ?

131voto

newfurniturey Points 16866

Vous devriez être en mesure de poursuivre les séquences directement dans votre système d'information existant. -f spécification.

Pour sauter les numéros 5 et 7, essayez :

cut -d, -f-4,6-6,8-

Comme vous sautez une seule colonne séquentielle, cela peut aussi s'écrire comme suit :

cut -d, -f-4,6,8-

Pour continuer, si vous voulez sauter 5, 7 et 11, vous utiliserez :

cut -d, -f-4,6-6,8-10,12-

Pour y voir plus clair, il est plus facile de visualiser les colonnes de début et de fin qui se trouvent respectivement au début et à la fin de la liste des séquences. Par exemple, l'exemple suivant imprimera les colonnes 2 à 20, en sautant les colonnes 5 et 11 :

cut -d, -f2-4,6-10,12-20

Ainsi, on imprimera "2 à 4", on sautera 5, "6 à 10", on sautera 11, puis "12 à 20".

30voto

Chris Johnson Points 2887

Il est parfois plus facile de réfléchir aux champs à exclure.

Si le nombre de champs qui ne sont pas coupés (qui ne sont pas conservés dans la sortie) est faible, il peut être plus facile d'utiliser la commande --complement par exemple pour inclure tous les champs 1-20 sauf 3, 7 et 12 -- faites ceci :

cut -d, --complement -f3,7,12 <inputfile

Plutôt que de

cut -d, -f-2,4-6,8-11,13-

12voto

Lorunification Points 968

Vous pouvez couper toutes les colonnes impaires/paires en utilisant seq :

Cela permet d'imprimer toutes les colonnes impaires

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10)

Pour imprimer toutes les colonnes paires, vous pouvez utiliser

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10)

En modifiant le deuxième chiffre de seq, vous pouvez spécifier les colonnes à imprimer.

Si la spécification des colonnes à imprimer est plus complexe, vous pouvez également utiliser une clause de type "one-liner-if-clause" telle que

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done)

Ceci imprimerait toutes les colonnes de 1 à 5 - vous pouvez simplement modifier les conditions pour créer des conditions plus complexes afin de spécifier si une colonne doit être imprimée ou non.

4voto

Chris Koknat Points 1732

La même chose peut être faite avec Perl
Comme il utilise une indexation basée sur 0 au lieu d'une indexation basée sur 1, les valeurs des champs sont décalées de 1.

perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'    

est équivalent à :

cut -d, -f2-4,6-10,12-20

Si les virgules ne sont pas nécessaires dans le résultat :

perl -F, -lane 'print "@F[1..3,5..9,11..19]"'

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