Enviado em 21/01/2020 - 15:24h
E aí galera, tudo beleza?
Queria a ajuda de vocês.... Estou fazendo um loop onde valido alguns logins que geralmente são compostos pelo CPF + '-' + Número Identificador de 4 dígitos (ex.: xxxxxxxxxxx-xxxx), qualquer coisa diferente disso eu tenho que jogar para um outro arquivo, mas ao mesmo tempo, tenho q deletar essas mesmas linhas do arquivo original.
Por exemplo:
"12345678912-1234","0.5","Curso: ABCD"
"09876543212-0258","1","Curso: XPTO"
"1234_4569","0.8","Curso" XPTO"
"36925801479-5236","0.9","Curso: FGHI"
"12358960785-XXXX","0.6","Curso: ABCD"
Sendo assim dessas linhas acima, as linhas 3 e 5 devem enviadas para outro arquivo e ao mesmo tempo deletadas, pois não estão dentro do padrão de login que tenho.
Sei que poderia fazer um sed dentro do while pra deletá-las porém esse processo para um arquivo de 17500 linhas demora mais de 10 minutos.
Aí que entra a ajuda, ao invés de fazer essa deleção linha a linha teria uma opção de armazenar essas linhas em uma variável e ao final do done deletar tudo de uma vez? Sabendo que a estrutura do sed para deleção de múltiplas linha é: sed '1d;5d;9d;$d' arq_teste.txt
Se tiver outra forma mais fácil aceito sugestões galera.
Veja como está meu código até o momento:
#!/bin/ksh
varSomenteNumero='^[0-9]+$'
n=1
while read -r line;
do IFS="|" read -a fld <<< "$line";
varLoginFuncionario=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-16`
varLoginFuncionarioCount=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-16 | awk '{print length}'`
varLoginFuncionarioParte1=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-11`
varLoginFuncionarioParte2=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c13-16`
varVerificaTraco=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-16 | grep '-' | wc -l`
if ! [[ $varLoginFuncionarioParte1 =~ $varSomenteNumero ]] ||
! [[ $varLoginFuncionarioParte2 =~ $varSomenteNumero ]] ||
[ $varVerificaTraco -ne 1 ] ||
[ $varLoginFuncionarioCount -ne 16 ]; then
echo "O login:" $varLoginFuncionario "está fora do padrão estabelecido: CPF + '-' + Núm. Identificador (Ex.: xxxxxxxxxxx-xxxx)." >> ARQ_LOGINS_ERRO.TXT
sed -i "$n d" ARQ_CURSO.txt;
fi
: $((n++))
done < ARQ_CURSO.txt;
Desde já muito obrigado. Qualquer coisa tamu aew.
Abç.
Queria a ajuda de vocês.... Estou fazendo um loop onde valido alguns logins que geralmente são compostos pelo CPF + '-' + Número Identificador de 4 dígitos (ex.: xxxxxxxxxxx-xxxx), qualquer coisa diferente disso eu tenho que jogar para um outro arquivo, mas ao mesmo tempo, tenho q deletar essas mesmas linhas do arquivo original.
Por exemplo:
"12345678912-1234","0.5","Curso: ABCD"
"09876543212-0258","1","Curso: XPTO"
"1234_4569","0.8","Curso" XPTO"
"36925801479-5236","0.9","Curso: FGHI"
"12358960785-XXXX","0.6","Curso: ABCD"
Sendo assim dessas linhas acima, as linhas 3 e 5 devem enviadas para outro arquivo e ao mesmo tempo deletadas, pois não estão dentro do padrão de login que tenho.
Sei que poderia fazer um sed dentro do while pra deletá-las porém esse processo para um arquivo de 17500 linhas demora mais de 10 minutos.
Aí que entra a ajuda, ao invés de fazer essa deleção linha a linha teria uma opção de armazenar essas linhas em uma variável e ao final do done deletar tudo de uma vez? Sabendo que a estrutura do sed para deleção de múltiplas linha é: sed '1d;5d;9d;$d' arq_teste.txt
Se tiver outra forma mais fácil aceito sugestões galera.
Veja como está meu código até o momento:
#!/bin/ksh
varSomenteNumero='^[0-9]+$'
n=1
while read -r line;
do IFS="|" read -a fld <<< "$line";
varLoginFuncionario=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-16`
varLoginFuncionarioCount=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-16 | awk '{print length}'`
varLoginFuncionarioParte1=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-11`
varLoginFuncionarioParte2=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c13-16`
varVerificaTraco=`echo "$line" | cut -d',' -f1 | sed 's/"//g' | sed 's/ //g' | cut -c1-16 | grep '-' | wc -l`
if ! [[ $varLoginFuncionarioParte1 =~ $varSomenteNumero ]] ||
! [[ $varLoginFuncionarioParte2 =~ $varSomenteNumero ]] ||
[ $varVerificaTraco -ne 1 ] ||
[ $varLoginFuncionarioCount -ne 16 ]; then
echo "O login:" $varLoginFuncionario "está fora do padrão estabelecido: CPF + '-' + Núm. Identificador (Ex.: xxxxxxxxxxx-xxxx)." >> ARQ_LOGINS_ERRO.TXT
sed -i "$n d" ARQ_CURSO.txt;
fi
: $((n++))
done < ARQ_CURSO.txt;
Desde já muito obrigado. Qualquer coisa tamu aew.
Abç.