Saya memiliki string yang ingin saya format. Saya ingin menghapus semuanya di antara ;
. kedua dan ;
. terakhir kedua .
Masukan
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;
Keluaran
cellular organisms;Eukaryota;Tribolium castaneum;
Saya telah mencoba menggunakan 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;"
menghasilkan
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;
Jawaban yang Diterima:
Anda dapat melakukannya dengan mudah dengan awk
:
awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'
Ini membagi input menggunakan ;
(-F\;
), dan mencetak yang pertama ($1
), kedua ($2
), kolom kedua dari terakhir dan terakhir ($(NF-1)
dan $NF
; NF
berisi jumlah bidang).
Varian berikut menggunakan kembali pemisah bidang yang ditentukan dalam output:
awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'
Janis menyarankan versi yang lebih baik menggunakan OFS
juga:
awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'
atau, jika Anda ingin menyimpan pemisah sebagai parameter lain:
awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'
Mengapa "ls" Membutuhkan Proses Terpisah Untuk Dieksekusi?
Utilitas Dari:Perintah Dalam Scripting Shell, Mengingat Itu Secara Eksplisit Tidak Melakukan Apa-apa?