Você pode usar awk
para percorrer a matriz e contar o número de 1s e 0s usando o seguinte script:
count.awk :
NR != 1 {
for (i=1; i<=NF; ++i)
count[i] += $i;
}
END {
ORS = ",";
for (i=1; i<=length(count); ++i)
if (count[i] >= min)
print i
}
Se você executar este script usando
awk -v min=2 -f count.awk matrix.txt
você receberá uma linha de colunas com dois ou mais 1s, neste caso "1,2,4,8,9" (observação: você pode alterar o min=X
para qualquer limite mínimo desejado).
Agora, use cut
para imprimir apenas as colunas que desejamos:
cols=$(awk -v min=2 -f count.awk matrix.txt); cut -d' ' -f${cols:0:-1} matrix.txt
Isso armazena a saída awk
em uma variável (a razão para isso é que awk
retorna uma lista de colunas com um ,
extra no final. Eu "fatia" a vírgula quando eu passo os cols para cut
).
Defina o delimitador para cut
para "espaço" ( -d' '
) e as colunas de saída para a lista separada por vírgulas de awk
, com a última vírgula sendo dividida ( -f${cols:0:-1}
).
Saída:
1 2 4 8 9 n
1 0 1 1 0 0
0 1 0 0 0 1
1 0 0 1 1 0
0 1 1 0 0 0
0 1 0 0 1 1
Se você deseja produzir as colunas com menos de min
1s (ou seja, colunas 3, 5, 6, 7), apenas inverta a condição da instrução if
no script awk
acima para ler if (count[i] < min)
.
Saída:
3 5 6 7
0 0 0 0
0 0 0 0
0 0 0 0
1 0 1 0
0 1 0 1