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}'