Ho una stringa che vorrei formattare. Vorrei rimuovere tutto tra il secondo ;
e penultimo ;
.
Ingresso
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;
Uscita
cellular organisms;Eukaryota;Tribolium castaneum;
Ho provato a usare 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;
Risposta accettata:
Puoi farlo facilmente con awk
:
awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Questo divide l'input usando ;
(-F\;
) e stampa il primo ($1
), secondo ($2
), penultimo e ultimo campo ($(NF-1)
e $NF
; NF
contiene il numero di campi).
La variante seguente riutilizza il separatore di campo specificato nell'output:
awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Janis ha suggerito una versione migliorata utilizzando OFS
anche:
awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
oppure, se vuoi mantenere il separatore come un altro parametro:
awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'