2番目と最後から2番目の一致の間のすべての項目を削除します。

2番目と最後から2番目の一致の間のすべての項目を削除します。

書式を設定したい文字列があります。 2番目と2番目から最後の間の;すべてを削除したいと思います;

入力する

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;  

出力

cellular organisms;Eukaryota;Tribolium castaneum;

使ってみました。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;"

生産する

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;

答え1

以下を使用すると、簡単にこれを行うことができますawk

awk -F\; '{print $1 ";" $2 ";" $(NF-1) ";" $NF}'

;これは()を使用して入力を分割し-F\;、最初の($1)、2番目($2)、2番目から最後と最後のフィールド(および$(NF-1);$NFNFはフィールド数を含む)を印刷します。

次のバリアントは、出力で指定されたフィールド区切り文字を再利用します。

awk -F\; '{print $1 FS $2 FS $(NF-1) FS $NF}'

ジャニスまた、拡張バージョンを使用することをお勧めしますOFS

awk 'BEGIN{FS=OFS=";"} {print $1,$2,$(NF-1),$NF}'

または、区切り文字を別のパラメータとして保持したい場合:

awk -F\; 'BEGIN{OFS=FS} {print $1,$2,$(NF-1),$NF}'

答え2

いくつかのPerlメソッド。すべての場合にこのコマンドを実行して、以下を入力します$string

string="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;"

 

$ perl -F';' -lane '$"=";"; print "@F[0,1,$#F-1];"' file 
cellular organisms;Eukaryota;Tribolium castaneum;

または

$ perl -F';' -lane 'print "$F[0];$F[1];$F[$#F];"' <<<"$string"
cellular organisms;Eukaryota;Tribolium castaneum;

または

$ perl -F';' -lane 'print join(";", @F[0,1,$#F-1]) . ";"' <<<"$string"
cellular organisms;Eukaryota;Tribolium castaneum;

答え3

別のsed方法:

sed 's/\(^[^;]*\;[^;]*\).*\(\;[^;]*\;$\)/\1\2/'

出力: cellular organisms;Eukaryota;Tribolium castaneum;

答え4

sed -n 's/\(;[^;]*;\).*\(;.*;\)/\1\2/p' <infile

...上記の内容は、p4文字以上の入力行に一致する項目のみを印刷し、その入力行の場合、それぞれ2番目と最後から2番目の発生文字を含む前後に;来る内容のみ印刷されます。;

ただし、最初に次の項目が4つ以上あることを確認すると、これを行う方が簡単です。

 sed -n '/\(;.*\)\{4\}/s/[^;]*//3p' <infile

まず、行が4以上に一致することを確認して;から、セミコロンではなく0個以上の文字シーケンスから3番目の項目を削除します。このテストs///は、少なくとも2つのセミコロンに一致するすべての行に置換を適用できるため必要です。はい;削除を試みる前に、最後にセカンドセミコロンを追加します。

上記の2つの解決策は、交換が成功した行だけを印刷します。削除-npコマンドを使用して、すべての行を印刷できます。置換は試行され続け、一致する行の結果のみが印刷されますが、他のすべての行はとにかく印刷されます。

もちろん、入力内容が確実な場合は、次のものが必要です。

sed 's/[^;]*//3' <infile

関連情報