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.