substitui o padrão entre dois caracteres

3
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)

a vírgula está separando itens diferentes e em cada item eu quero remover tudo entre - e : incluindo - mas mantendo: Como eu posso fazer isso? por isso deve parecer

Staphylococcus_sp_HMSC14C01:0.00371647154267842634,Staphylococcus_hominis_VCU122:0.00124439639436691308)69:0.00227646100249620856

Eu usei sed 's/-.*://' 1.file > 2.file , mas acabei removendo o arquivo inteiro e mantive o primeiro e o último valor.

    
por Ahmed Magdy Moustafa 29.09.2017 / 22:44

2 respostas

6

.* é um regexp ganancioso, correspondendo à possível correspondência mais longa . Você precisa combinar a partida mais curta, mas combiná-la globalmente em toda a linha. Experimente

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

A classe de caractere [^:-] corresponde a qualquer coisa exceto dois pontos e traço (e talvez deva corresponder a qualquer coisa exceto cólon somente), então o regexp diz "traço seguido por qualquer número de não traço, não caracteres -colon seguidos de dois pontos ". Em seguida, ele substitui isso por dois pontos (desde que você queria manter isso) e faz a substituição globalmente (o g à direita) na linha. Se você omitir o g , somente a primeira instância seria substituída.

    
por 29.09.2017 / 22:51
4
Solução

Awk :

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

  • for(i=1;i<=NF;i++) - iterando por todos os campos do registro

  • sub(/-[^:-]+/,"",$i - substitua a sequência necessária ( entre - e : incluindo - , mas mantendo : )

A saída:

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)
    
por 29.09.2017 / 22:57