Aqui está uma abordagem de Perl:
$ perl -lane '@k=($F[1]=~/,/g); $i=$#k+2; $l=length($F[2]);
print "@F $i $l ", $l/$i' file
A 1,2,3 * 3 1 0.333333333333333
A 4,5,6 ** 3 2 0.666666666666667
B 1 1 0
B 4,5 * 2 1 0.5
Ou, com printf
para uma bela formatação:
$ perl -lane '@k=($F[1]=~/,/g); $i=$#k+2; $l=length($F[2]);
printf "%s %-5s %-3s %s %3s %10f\n",@F,$i,$l,$l/$i' file
A 1,2,3 * 3 1 0.333333
A 4,5,6 ** 3 2 0.666667
B 1 1 0 0.000000
B 4,5 * 2 1 0.500000
Explicação
-
-lane
: o -l
remove as novas linhas à direita de cada linha de entrada; o -a
divide automaticamente cada linha de entrada na matriz @F
no espaço em branco; o -n
significa "leia o arquivo de entrada linha por linha" e o -e
permite passar um script como um parâmetro de linha de comando.
-
@k=($F[1]=~/,/g); $i=$#k+2;
: a matriz @k
contém todas as vírgulas encontradas no segundo campo. Então, $i
está definido para o maior índice é @F
( $#F
) mais dois. O sinal de adição 2 é necessário porque i) os arrays são contados a partir de 0, então o maior índice de um array de um único elemento será 0. Estamos contando vírgulas, não valores, então precisamos adicionar mais um, pois 1,2
tem dois valores mas apenas uma vírgula.
-
$l=length($F[2]);
: $l
agora é o número de caracteres do campo 3d.
-
print "@F $i $l ", $l/$i
: imprime as informações solicitadas. @F
é a linha do arquivo de entrada e o resto é o que você pediu.