Ich habe eine Zeichenfolge, die ich formatieren möchte. Ich möchte alles zwischen dem zweiten ;
entfernen und vorletzter ;
.
Eingabe
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;
Ausgabe
cellular organisms;Eukaryota;Tribolium castaneum;
Ich habe versucht, sed
zu verwenden
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;"
produziert
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;
Akzeptierte Antwort:
Das geht ganz einfach mit awk
:
awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Dies teilt die Eingabe mit ;
auf (-F\;
) und druckt die erste ($1
), zweitens ($2
), vorletztes und letztes Feld ($(NF-1)
und $NF
; NF
enthält die Anzahl der Felder).
Die folgende Variante verwendet das angegebene Feldtrennzeichen in der Ausgabe erneut:
awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Janis schlug eine verbesserte Version mit OFS
vor auch:
awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
oder, wenn Sie das Trennzeichen als weiteren Parameter beibehalten möchten:
awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'