J'ai une chaîne que je voudrais formater. Je voudrais tout supprimer entre le second ;
et avant-dernier ;
.
Entrée
cellular organisms;Eukaryota;Opisthokonta;Metazoa;Eumetazoa;Bilateria;Protostomia;Ecdysozoa;Panarthropoda;Arthropoda;Mandibulata;Pancrustacea;Hexapoda;Insecta;Dicondylia;Pterygota;Neoptera;Endopterygota;Coleoptera;Polyphaga;Cucujiformia;Tenebrionoidea;Tenebrionidae;Tenebrionidae incertae sedis;Tribolium;Tribolium castaneum;
Sortie
cellular organisms;Eukaryota;Tribolium castaneum;
J'ai essayé d'utiliser sed
sed 's/;[^;]*//' <<<"cellular organisms;Eukaryota;Opisthokonta;Metazoa;Eumetazoa;Bilateria;Protostomia;Ecdysozoa;Panarthropoda;Arthropoda;Mandibulata;Pancrustacea;Hexapoda;Insecta;Dicondylia;Pterygota;Neoptera;Endopterygota;Coleoptera;Polyphaga;Cucujiformia;Tenebrionoidea;Tenebrionidae;Tenebrionidae incertae sedis;Tribolium;Tribolium castaneum;"
produit
cellular organisms;Opisthokonta;Metazoa;Eumetazoa;Bilateria;Protostomia;Ecdysozoa;Panarthropoda;Arthropoda;Mandibulata;Pancrustacea;Hexapoda;Insecta;Dicondylia;Pterygota;Neoptera;Endopterygota;Coleoptera;Polyphaga;Cucujiformia;Tenebrionoidea;Tenebrionidae;Tenebrionidae incertae sedis;Tribolium;Tribolium castaneum;
Réponse acceptée :
Vous pouvez le faire facilement avec awk
:
awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Cela divise l'entrée en utilisant ;
(-F\;
), et imprime le premier ($1
), deuxième ($2
), avant-dernier et dernier champs ($(NF-1)
et $NF
; NF
contient le nombre de champs).
La variante suivante réutilise le séparateur de champ spécifié dans la sortie :
awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Janis a suggéré une version améliorée en utilisant OFS
aussi :
awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
ou, si vous souhaitez conserver le séparateur comme autre paramètre :
awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'