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)