Eu tenho um arquivo de texto como o abaixo, embora com quase muitas colunas. Desejo extrair nomes de colunas que tenham uma proporção/número específico de valores TRUE, por exemplo, colunas com TRUE em 2 das 9 linhas (com valores TRUE/FALSE).
Como alternativa, seria bom extrair colunas com pelo menos um certo número (por exemplo, 2) de valores VERDADEIROS. No exemplo acima, seriam colunas com 2 a 9 linhas possíveis com valores TRUE. Deve ser generalizável para arquivos com diferentes números de linhas.
Obrigado!
Exemplo de arquivo de entrada:
Comparison MT group1 group1.1 group1.2 group1.3 group1.4 group1.5 group1.6 group1.7 group1.8 group1.9
BP:HA FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
CB:HA FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
HA:PI TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
AL:GR FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
AL:LA TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
AL:PL FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
GR:PP FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
LA:PP TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
PL:PP FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
Resultado desejado para colunas com 2 ou mais valores TRUE :
arquivo de saída:
MT
group1
group1.9
Aqui está uma maneira de escolher as colunas com instâncias suficientes de
TRUE
, usando o bash:A saída pode ser grepada para strings como "3 de 9", para obter o número da coluna (contando a partir de 0):
Examine todas as colunas e acumule a contagem de "VERDADEIRO" para cada coluna.
No final, imprima todas as colunas iguais ou maiores que um ponto de ajuste:
Na execução (para os dados que você forneceu):
A coluna 2 (MT) tem mais de 1 valor VERDADEIRO: 3 de fato.
A coluna 3 (grupo1) tem 2 valores TRUE.
A coluna 11 (group1.8) tem 1 valor TRUE. A coluna 12 (group1.9) tem 3 valores TRUE.
Se você não fornecer uma proporção, o padrão será 0,3.
O
awk
programa recebe um parâmetrop
que é a porcentagemTRUE
necessária para que o cabeçalho de uma coluna seja exibido.Desde a primeira linha, ele salva todos os cabeçalhos de coluna no array
cols
. Em seguida, resume quantas vezes a palavraTRUE
ocorre em cada coluna. No final, ele calcula a porcentagem de linhas que estavamTRUE
em cada coluna comocp
e compara comp
. Se for maior que op
valor fornecido, o nome da coluna e a porcentagem serão exibidos.