Tengo una cadena que me gustaría formatear. Me gustaría eliminar todo entre el segundo ; y penúltimo ; .
Entrada
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;
Salida
cellular organisms;Eukaryota;Tribolium castaneum;
He intentado usar 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;"
produce
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;
Respuesta aceptada:
Puedes hacer esto fácilmente con awk :
awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Esto divide la entrada usando ; (-F\; ) e imprime el primero ($1 ), segundo ($2 ), penúltimo y último campo ($(NF-1) y $NF; NF contiene el número de campos).
La siguiente variante reutiliza el separador de campo especificado en la salida:
awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Janis sugirió una versión mejorada usando OFS también:
awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
o, si desea mantener el separador como otro parámetro:
awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'