Eu tenho um arquivo que tem, digamos, 5 colunas (obtidas redirecionando os resultados de uma consulta de seleção do Sybase). Cada coluna é separada por uma tabulação. Eu preciso filtrar as colunas que têm todos os NULLs. Qualquer coluna entre as cinco pode ser nula.
Por exemplo, se as colunas no arquivo forem parecidas com as abaixo:
1000 NULL NULL 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
A saída deve estar (após a remoção das colunas 2 e 5), preferencialmente no mesmo arquivo:
1000 NULL 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
Eu alcancei:
for i in {1..5}
do
echo $i
dlr="$"$i
str="{print $dlr}"
echo $str
awk '$str' <input_file> | while read value
do
echo $value
if [ "$value" == "NULL" ]
then
echo "inside"
cut $i
fi
done
done
valor agora, mostra todas as linhas!!! Além disso, não tenho certeza de como cortar a coluna. Eu sou um iniciante em script de shell e incapaz de prosseguir.
Você pode por favor aconselhar como fazer isso?
Por meio do utilitário GNU
datamash
, você primeiro inverte as linhas, depois exclui todas as linhas nulas e inverte as linhas novamente:Você não pode fazer isso sem processar o arquivo duas vezes. O seguinte é usado primeiro para construir o comando
awk
final :cut
Eu realmente não gosto desta solução, mas parece funcionar:
input
(seu arquivo de entrada)skip
(array que será preenchido posteriormente)c
(será definido para o número de colunas em seu arquivo. Isso pressupõe que todo o arquivo tenha um número uniforme de colunas)NULL
. Nesse caso, adicionaremos esse número de coluna àskip
matrizIFS
como uma vírgula (o motivo pelo qual estou usando um subshell) e passamos oskip
array como um valor separado por vírgula para umaawk
variável. Isso é para que possamos usarsplit
para converter essa variável de volta em umaawk
matriz.awk
irá então percorrer cada número nas
matriz e definir essa coluna como vazia e imprimir o que resta.Comando:
resultado