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ávely
para o segundo valor da coluna que queremos contar e uma variávelx
para a linha inteira. Essas variáveis são usadas em iterações posteriores. Esses valores também são índices em dois arraysb
ec
, 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 matriza
e imprimimos seus valores (que é um simples despejo do conteúdo dos arquivos). Também imprimimos os valores contados nos outros dois arraysb
ec
.
A saída dá:
C1 NC01 2 2
NC01
C2 NC01 3 2
NC01
NC02
C3 NC01 3 1
NC02
NC03