서식을 지정하고 싶은 문자열이 있습니다. 두 번째 와 두 번째에서 마지막 ;
사이의 모든 것을 제거하고 싶습니다 ;
.
입력하다
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
...위의 내용은 p
4자 이상의 입력 줄과 일치하는 항목만 인쇄 하며 해당 입력 줄의 경우 각각 두 번째 및 마지막에서 두 번째 발생 문자를 ;
포함하여 앞뒤에 오는 내용만 인쇄됩니다. ;
.
그러나 먼저 다음과 같은 항목이 4개 이상 있는지 확인하면 이 작업을 수행하는 것이 더 쉽습니다.
sed -n '/\(;.*\)\{4\}/s/[^;]*//3p' <infile
먼저 줄이 4 이상과 일치하는지 확인한 ;
다음 세미콜론이 아닌 0개 이상의 문자 시퀀스에서 세 번째 항목을 제거합니다. 이 테스트 s///
는 최소한 2개의 세미콜론과 일치하는 모든 줄에 대체가 적용될 수 있기 때문에 필요합니다 .예;
제거를 시도하기 전에 끝에서 두 번째 세미콜론을 추가하십시오.
위에서 제안한 두 가지 해결 방법은 교체가 성공한 줄만 인쇄합니다. 제거 -n
및 p
명령을 사용하여 모든 행을 인쇄할 수 있습니다. 대체는 계속 시도되며 일치하는 행의 결과만 인쇄되지만 다른 모든 행은 어쨌든 인쇄됩니다.
물론 입력 내용이 확실하다면 다음이 필요합니다.
sed 's/[^;]*//3' <infile