Mám řetězec, který bych chtěl zformátovat. Chtěl bych odstranit vše mezi druhým ;
a předposlední ;
.
Vstup
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;
Výstup
cellular organisms;Eukaryota;Tribolium castaneum;
Zkoušel jsem použít 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;"
produkuje
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;
Přijatá odpověď:
Můžete to udělat snadno pomocí awk
:
awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Toto rozdělí vstup pomocí ;
(-F\;
) a vytiskne první ($1
), druhý ($2
), předposlední a poslední pole ($(NF-1)
a $NF
; NF
obsahuje počet polí).
Následující varianta znovu používá zadaný oddělovač polí ve výstupu:
awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Janis navrhla vylepšenou verzi pomocí OFS
taky:
awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
nebo, chcete-li ponechat oddělovač jako další parametr:
awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'
Proč „ls“ vyžaduje samostatný proces pro provedení?
Užitečnost:Příkaz ve skriptování Shell, vzhledem k tomu, že explicitně nic nedělá?