Contando repetições consecutivas de um caractere específico (por exemplo,)

2

Digamos que eu tenha um arquivo com linhas como as seguintes:

foo,bar,,baz,xy
foo,,bar,baz,xy,,

Eu gostaria de contar quantas vezes eu tenho ,, (duas vírgulas consecutivas cercadas por qualquer outro caractere) em cada linha.

Minha abordagem até agora: achei que poderia primeiro eliminar tudo , mas qualquer par de vírgulas consecutivas em cada linha, e depois substituir essas duas vírgulas por uma única vírgula para que eu possa contá-las mais tarde. Como posso fazer isso?

A resposta acima deve ser (se substituirmos a vírgula dupla por uma única vírgula, jogando todo o resto fora):

,
,,

ou simplesmente:

1
2
    
por Amelio Vazquez-Reina 12.02.2014 / 23:56

1 resposta

5

Um one-liner Perl para o trabalho:

perl -nle 'print s/(^|[^,]),,([^,]|$)/$&/g' your_file

Ou, ainda mais curto, com awk :

 awk -F',,' '{print NF-1}' your_file

O awk um consideraria ,,,, como duas ocorrências de ,, , enquanto o perl não o contaria. Escolha o que melhor se adequa ao seu caso de uso.

Atualizar

Em seu comentário Parece que sua intenção original era contar o número de campos vazios em cada linha. Se for esse o caso, este one-liner Perl deve ajudar (ele assume que não há campos entre aspas que contenham vírgulas):

perl -nle 'print scalar grep {//} split/,/' your_file

O mesmo em awk se Perl não estiver disponível:

awk -F, 'empty=0;{for(i=1;i<=NF;i++)if($i=="")empty++};{print empty}' your_file
    
por 13.02.2014 / 00:34