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 ?
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 ?
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".
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-
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.
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 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.