두 문자 사이의 패턴 바꾸기

두 문자 사이의 패턴 바꾸기
Staphylococcus_sp_HMSC14C01-KV792037.1:0.00371647154267842634,Staphylococcus_hominis_VCU122-AHLD01000058.1:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01-KV814990.1:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE-JUSR01000051.1:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE-JVVL01000037.1:0.00594050248317441135)

쉼표는 서로 다른 항목을 구분하며 각 항목에서 그 사이에 있는 모든 항목을 제거하고 -.:-:

어떻게 해야 하나요? 따라서 다음과 같아야 합니다.

Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856

를 사용했는데 sed 's/-.*://' 1.file > 2.file결국 파일 전체를 삭제하고 첫 번째 값과 마지막 값만 유지했습니다.

답변1

.*다음과 일치하는 탐욕스러운 정규 표현식입니다.가장 긴가능한 일치. 가장 짧은 일치 항목을 일치시켜야 하지만 전체 줄에서 전체적으로 일치해야 합니다. 노력하다

sed 's/-[^:-]*:/:/g' 1.file > 2.file

문자 클래스는 [^:-]무엇이든 일치합니다.와는 별개로콜론과 대시(콜론을 제외한 모든 항목과 일치해야 할 수도 있음), 따라서 정규식은 "대시 뒤에 대시가 아닌, 콜론이 아닌 문자가 오고 그 뒤에 콜론이 옵니다"를 의미합니다. 그런 다음 이를 콜론으로 대체하고(유지하고 싶기 때문에) g해당 행에서 전역 대체(후행)를 수행합니다. 생략하면 g첫 번째 인스턴스만 교체됩니다.

답변2

해결책:

awk -F',' '{ for(i=1;i<=NF;i++) sub(/-[^:-]+/,"",$i) }1' OFS=',' 1.file

  • -F','- 필드 구분 기호

  • for(i=1;i<=NF;i++)- 레코드의 모든 필드를 반복합니다.

  • sub(/-[^:-]+/,"",$i- 원하는 시퀀스를 교체합니다(~ 사이-그리고:포함하다-하지만 계속:)


산출:

Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856,(Staphylococcus_sp_HMSC072E01:0.00288325234399461859,(((Staphylococcus_hominis_793_SHAE:0.00594391769091206796,Staphylococcus_pettenkoferi_1286_SHAE:0.00594050248317441135)

관련 정보