두 번째와 마지막에서 두 번째 일치 사이의 모든 항목을 제거합니다.

두 번째와 마지막에서 두 번째 일치 사이의 모든 항목을 제거합니다.

서식을 지정하고 싶은 문자열이 있습니다. 두 번째 와 두 번째에서 마지막 ;사이의 모든 것을 제거하고 싶습니다 ;.

입력하다

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), 두 번째에서 마지막 및 마지막 필드( $(NF-1)$NF; NF에는 필드 수 포함)를 인쇄합니다.

다음 변형은 출력에서 ​​지정된 필드 구분 기호를 재사용합니다.

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자 이상의 입력 줄과 일치하는 항목만 인쇄 하며 해당 입력 줄의 경우 각각 두 번째 및 마지막에서 두 번째 발생 문자를 ;포함하여 앞뒤에 오는 내용만 인쇄됩니다. ;.

그러나 먼저 다음과 같은 항목이 4개 이상 있는지 확인하면 이 작업을 수행하는 것이 더 쉽습니다.

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

먼저 줄이 4 이상과 일치하는지 확인한 ;다음 세미콜론이 아닌 0개 이상의 문자 시퀀스에서 세 번째 항목을 제거합니다. 이 테스트 s///는 최소한 2개의 세미콜론과 일치하는 모든 줄에 대체가 적용될 수 있기 때문에 필요합니다 .;제거를 시도하기 전에 끝에서 두 번째 세미콜론을 추가하십시오.

위에서 제안한 두 가지 해결 방법은 교체가 성공한 줄만 인쇄합니다. 제거 -np명령을 사용하여 모든 행을 인쇄할 수 있습니다. 대체는 계속 시도되며 일치하는 행의 결과만 인쇄되지만 다른 모든 행은 어쨌든 인쇄됩니다.

물론 입력 내용이 확실하다면 다음이 필요합니다.

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

관련 정보