GNU/Linux >> Tutoriales Linux >  >> Linux

¿Eliminar todo lo que haya entre la segunda y la penúltima coincidencia?

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

Linux
  1. Instalar y quitar software en Manjaro

  2. ¿Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

  3. ¿Diferencia entre 2>&-, 2>/dev/null, |&, &>/dev/null y>/dev/null 2>&1?

  4. ¿Cuál es la diferencia entre Sudo Su y Sudo Su?

  5. ¿Diferencia entre $HOME y '~' (tilde)?

Explicación de la diferencia entre apt y apt-get

¿La diferencia entre [[ $a ==Z* ]] y [ $a ==Z* ]?

¿Diferencia entre tubería y expansión de comando?

¿Diferencia entre el usuario de Sudo y el usuario raíz?

¿Diferencia entre Snat y Masquerade?

Vim vs Vi:¿similitudes y diferencias entre VIM y VI?