Tenho um código rodando em uma máquina Linux, que conta o número de TRUEs encontrados em uma determinada coluna/campo, imprimindo como saída o número da coluna e o número de TRUEs naquela coluna.
Na nova entrada, as linhas são atribuídas (última coluna na entrada) como "grande" ou "pequena" (três de cada).
Eu gostaria de contar o número de "pequenos" e "grandes" para cada coluna com 2 ou mais TRUEs.
Código para encontrar colunas com 2 ou mais TRUEs (sei que o código abaixo ignora a primeira coluna de entrada):
awk -vtc=2 'NR==1{next};
NR==2{for(i=2;i<=NF;i++){t[i]=0}};
{for(i=2;i<=NF;i++){if($i=="TRUE"){t[i]++}}}
END{
for(j in t)
if(t[j]>=tc){print(j,t[j])}
}' input.tsv > output.tsv
Entrada.tsv:
MT MT MT MT MT MT MT MT MT MT
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE
output.tsv:
(primeira coluna: número da coluna; segunda coluna: número de TRUEs)
3 3
6 3
9 2
10 2
nova entrada.tsv
MT MT MT MT MT MT MT MT MT MT CAT
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE LARGE
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE SMALL
FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE SMALL
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE SMALL
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE LARGE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE LARGE
Saída desejada.tsv:
(terceira coluna: número de TRUEs atribuídos como pequenos; quarta coluna: número de TRUEs atribuídos como grandes)
3 3 2 1
6 3 1 2
9 2 1 1
10 2 0 2
A ajuda de qualquer um de vocês linux wizards é muito apreciada!
Uma solução que usa (pseudo) arrays multidimensionais em
awk
Ou usando verdadeiros arrays multidimensionais disponíveis no GNU awk
Marreta deselegante, mas parece funcionar
Resultado
EDITAR
Um pouco menos ofensivo em
awk
Isso usa pipelines com diferentes utilitários sendo invocados: