Eu preciso de um comando que irá remover quaisquer colunas em um arquivo de texto se eles tiverem =>${MaxAllowedNumberOfFs} 'F's dentro da coluna (uma coluna que terá um número variável de linhas).
Eu tenho algum pseudo código que está próximo, mas não sei como definir um limitador de número de correspondência.
digamos que o limitador está definido como 3 e o arquivo de entrada de exemplo é:
F G F H H
G F F F A
F G F F F
F F F T F
Então a saída desejada seria:
G H H
F F A
G F F
F T F
pseudo código que está próximo (o limitador pode e mudará dependendo dos arquivos):
MaxAllowedNumberOfFs="1012"
Count_of_columns=`awk '{print NF}' filename | sort -nr | sed -n '$p'`
for((i=1;i<=$Count_of_columns;i++)); do awk -v i="$i" -v x="$MaxAllowedNumberOfFs" '$i == F =>x number of times {$i="";print $0}' filename; done
Obviamente, eu poderia percorrer todas as colunas, contar o número de ocorrências na coluna usando grep e, em seguida, remover as colunas que não atendem aos critérios. mas isso seria muito lento. Realmente quero um comando bem awk para isso, mas não tenho as habilidades de awk
Uma abordagem é ler o arquivo duas vezes. Na primeira vez, contamos os F's, e na segunda vez, emitimos a linha. Então algo como
O
NR==FNR
é um truque para ver se esta é a primeira ou segunda vez que estamos lendo o arquivo. Supondo que haja alguma linha no arquivo, isso será verdade somente ao ler o arquivo pela primeira vez. A matrizc
é uma contagem do número de caracteres F nessa coluna. Onext
diz que todo o processamento dessa linha é concluído ao ler o arquivo pela primeira vez. A segunda linha é executada na segunda vez que o arquivo é lido.Aqui está uma ilustração do método de transposição - filtro de linha - transposição . Talvez seja inadequado para o seu caso (arquivo grande), mas pode ser útil para outras pessoas:
então
Tentei com o script abaixo e funcionou bem
resultado