GNU/Linux >> Znalost Linux >  >> Linux

Odstranit vše mezi druhým a druhým posledním výskytem shody?

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

Linux
  1. Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím?

  2. Rozdíl mezi 2>&-, 2>/dev/null, |&, &>/dev/null A>/dev/null 2>&1?

  3. Rozdíl mezi Gtk a Qt aplikacemi?

  1. Rozdíl mezi uživatelem Sudo a uživatelem root?

  2. Rozdíl mezi Snat a Masquerade?

  3. Rozdíl mezi $HOME a '~' (tilda)?

  1. Instalace a odebrání softwaru v Manjaro

  2. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  3. Jak odstranit toto varování:druhý parametr „va_start“ není poslední pojmenovaný argument?