distâncias de impressão do caractere desejado com base na ocorrência

0

Esta é uma extensão da minha pergunta anterior ( Padrão de impressão do caractere "C" ).

Eu gostaria de imprimir o caractere "C" da coluna "text" dada em file.csv. O arquivo .csv tem duas colunas como ID e texto.

Preciso editar as distâncias entre elas e o início do caractere, como seguir

Portanto, quando estiver na coluna "texto", imprimindo a distância entre dois caracteres C, como, se a coluna "texto" tiver valor DCFRCGHCCRF, deverá imprimir na terceira coluna 1C2C2CC2

exemplo de entrada

c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC

Exemplo de saída

c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14c0
    
por Trupti 28.04.2016 / 08:14

1 resposta

1

Que tal algo como isto

perl -F, -alne '
  my @a = split "C", @F[1]; 
  my @b = (map { $_ ? length $_ : "" } @a); 
  print join ",", (@F, join "c", @b)
' file.csv 
c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14

Ou mais compactamente

perl -F, -alne '
  print join ",", (@F, join "c", (map { $_ ? length $_ : "" } split "C", @F[1]))
' file.csv 

Para obter o comportamento desejado quando há um C à direita na entrada, é necessário modificar o comando split com um parâmetro explícito LIMIT , como observado - de alguma forma opaco - no split () perldoc :

% bl0ck_qu0te%

Então a expressão se torna

$ perl -F, -alne '
  print join ",", (@F, join "c", (map { $_ ? length $_ : "" } split "C", @F[1], -1))
' file.csv
c32_g1_i1_3,SCIPKHEECTNDKHNCCRKGLFKLKCQCSTFDDESGQPTERCACGRPMGHQAIETGLNIFRGLFKGKKKNKKTKG,1c6c6cc8c1c13c1c31
c32_g1_i1_6,ACAERKKKCTKDDDCSCCGKWDKCSCNWPGREGCFCMRGMMATRLWKMAKC,1c6c5c1cc5c1c7c1c14c

(inspiração para o map tirado da a maneira mais rápida de remover elementos de array vazios )

    
por steeldriver 29.04.2016 / 12:13