Use awk :
awk '{a[NR]=$0} {if(NF!=1){y=$2;x=$0;b[x]=1;c[x]=1}else{b[x]++;if(y==$1){c[x]++}}} END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}' file
É certo que não é o mais simples, mas funciona para mim com a sua contribuição.
Explicação:
-
{a[NR]=$0}: primeiro carregue todo o conteúdo do arquivo em uma matriz chamadaa. -
if(NF!=1): Se for uma linha em que temos várias colunas (mais de uma) ... -
{y=$2;x=$0;b[x]=1;c[x]=1}: ... define uma variávelypara o segundo valor da coluna que queremos contar e uma variávelxpara a linha inteira. Essas variáveis são usadas em iterações posteriores. Esses valores também são índices em dois arraysbec, onde armazenamos os valores de contagem. -
else{b[x]++;if(y==$1){c[x]++}}: se for uma linha com apenas uma coluna, incrementamos o valor na matrizb. E se essa coluna corresponder à segunda coluna na linha principal, que salvamos emy, também incrementaremos esse valor. -
END{for (n in a){z=a[n];print z" "b[z]" "c[z]}}: No final, percorremos a matrizae imprimimos seus valores (que é um simples despejo do conteúdo dos arquivos). Também imprimimos os valores contados nos outros dois arraysbec.
A saída dá:
C1 NC01 2 2
NC01
C2 NC01 3 2
NC01
NC02
C3 NC01 3 1
NC02
NC03