1. Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
rpbiaggiousa Outra
Post recolhido
Enviado em 03/02/2015 - 16:33h
Pessoal,
Preciso ler um arquivo que pode conter várias linhas. Nesse arquivo preciso pegar o campo $3 de cada uma delas e validar se é >50000 ou menor que 10.
Quando faço o awk ele me retorna todas as linhas de uma vez. Preciso que retorne a primeira, eu valido e depois retorne a segunda, eu valido e assim por diante.
Espero que tenha explicado de uma forma que todos entendam.
if [ "$Fix" -gt 50000 ]; then
echo "Limite maximo de CDRs para codigo FIX foi excedido - NOTOK $Fix"
exit
elif [ "$Fix" -lt 10 ]; then
echo "Limite minimo de CDRs para codigo FIX abaixo do esperado - NOTOK $Fix"
exit
else
echo "Limite maximo e minimo de CDRs para codigo FIX dentro do esperado - OK $Fix"
exit
fi
exit
Agora surgiu outra dúvida hahaha. Vou ter dois arquivos por dia. Preciso pensar como farei isso.
Obrigado pela ajuda,
No script acima, a variável $Fix armazena todos os códigos "FIX" e isto sempre causará erros de sintaxe caso possua mais de um código.
A descrição que você passou não confere com o script. Os limites para o "código FIX" estão mesclados no limites do "código MOV". Recomendo fortemente você pensar melhor o seu problema, até aqui, as informações que você passou foram muito imprecisas, incompletas e algumas são muito confusas, o problema em si parece algo bem simples, contudo, na prática, só seria possível avaliar se as informações fossem completas e concisas.
Talvez ajude, então segue uma sugestão de script com as velhas definições (adapte a sua necessidade):
while IFS=$'|\n' read -a f; do
[[ ${#f[*]} -lt 3 ]] && continue
unset msg
for (( i = 0; i <= ${#rules[*]}; i++ )); do
IFS=$' \n' read cod str min max <<< ${rules[$i]}
if [[ ${f[1]:0:8} == $str ]]; then
if [[ ${f[2]} -lt $min ]]; then
msg=( 'minimo' $cod ${f[2]} )
break
fi
if [[ ${f[2]} -gt $max ]]; then
msg=( 'maximo' $cod ${f[2]} )
break
fi
fi
done
if [[ ${#msg[*]} -ne 0 ]]; then
printf 'Limite %s de CDRs para o codigo %s foi excedido - NOTOK %s\n' ${msg[@]}
else
printf 'Limites maximo e minimo para CDRs para o codigo %s dentro do esperado %s\n' $cod ${f[2]}
fi
done < $MascaraVozT
Obs.: Nesse estágio já é bom começar a pensar em segmentar o script em funções por questões de legibilidade e manutenibilidade.
3. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
smithuxusa Arch Linux
Post recolhido
Enviado em 03/02/2015 - 16:54h
rpbiaggio escreveu:
Pessoal,
Preciso ler um arquivo que pode conter várias linhas. Nesse arquivo preciso pegar o campo $3 de cada uma delas e validar se é >50000 ou menor que 10.
Quando faço o awk ele me retorna todas as linhas de uma vez. Preciso que retorne a primeira, eu valido e depois retorne a segunda, eu valido e assim por diante.
Espero que tenha explicado de uma forma que todos entendam.
Obrigado.
Pode fazer somente com o AWK mesmo:
awk '$3 > 50000 || $3 < 10 {print}' arquivo.txt
4. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
removidousa Nenhuma
Post recolhido
Enviado em 03/02/2015 - 17:23h
rpbiaggio escreveu:
Pessoal,
Preciso ler um arquivo que pode conter várias linhas. Nesse arquivo preciso pegar o campo $3 de cada uma delas e validar se é >50000 ou menor que 10.
Quando faço o awk ele me retorna todas as linhas de uma vez. Preciso que retorne a primeira, eu valido e depois retorne a segunda, eu valido e assim por diante.
Espero que tenha explicado de uma forma que todos entendam.
Obrigado.
Posta o código.
5. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
rpbiaggiousa Outra
Post recolhido
Enviado em 03/02/2015 - 17:40h
Não deu certo... Não retornou o campo esperado. Esqueci de citar que na linha que tenha o código MOV (172867) o limite é 50000 na linha com código FIX (1588) o limite é 1000. Então preciso validar se a linha é MOV e se o campo $3 como delimitador o | esta abaixo de 50000, depois disso validar se o mesmo campo $3 da outra linha FIX esta abaixo de 1000. É bem complexo eu acho hahaha. Não sei se para vocês é tranquilo isso.
Não tenho ideia de como vou fazer essas validações.
7. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
removidousa Nenhuma
Post recolhido
Enviado em 03/02/2015 - 18:50h
rpbiaggio escreveu:
Não deu certo... Não retornou o campo esperado. Esqueci de citar que na linha que tenha o código MOV (172867) o limite é 50000 na linha com código FIX (1588) o limite é 1000. Então preciso validar se a linha é MOV e se o campo $3 como delimitador o | esta abaixo de 50000, depois disso validar se o mesmo campo $3 da outra linha FIX esta abaixo de 1000. É bem complexo eu acho hahaha. Não sei se para vocês é tranquilo isso.
Bem confuso a explicação versus o exemplo, "código MOV" corresponde ao valor 172867, está no quarto campo e a string do segundo campo tem "FIX". Já o "código FIX" corresponde ao valor 1588, também está no quarto campo e no segundo a string possui "MOV". Podemos assumir o valor do quarto campo apenas e esquecer esse detalhe ... Outro problema é a sua declaração de limite, você não diz se é limite mínimo, limite máximo ou qualquer combinação dos dois. Sem saber isto não tem como montar as condições para testar. Parece que o problema que você é bem simples de resolver, está apenas muito mal definido :P
8. Re: Guardar $3 de cada linha em variaveis diferentes
rpbiaggiousa Outra
Post recolhido
Enviado em 03/02/2015 - 19:01h
Vamos lá...
Tenho essas duas linhas no arquivo
1|TCO.FIX.D120202.H000021|172867|
1|TCO.MOV.D120202.H000021|1588|
Para a linha que tem o código FIX o limite máximo é 1000 e minimo 5
Para linhas com o código MOV o limite máxima é 50000 e minimo 10
Eu disse que é o terceiro campo pois estou delimitando pelo |.
Espero ter explicado melhor agora.
Obs: Posso ter várias linhas MOV e também várias FIX
Obrigado.
9. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
removidousa Nenhuma
Post recolhido
Enviado em 03/02/2015 - 19:01h
textmode escreveu:
rpbiaggio escreveu:
Não deu certo... Não retornou o campo esperado. Esqueci de citar que na linha que tenha o código MOV (172867) o limite é 50000 na linha com código FIX (1588) o limite é 1000. Então preciso validar se a linha é MOV e se o campo $3 como delimitador o | esta abaixo de 50000, depois disso validar se o mesmo campo $3 da outra linha FIX esta abaixo de 1000. É bem complexo eu acho hahaha. Não sei se para vocês é tranquilo isso.
Bem confuso a explicação versus o exemplo, "código MOV" corresponde ao valor 172867, está no quarto campo e a string do segundo campo tem "FIX". Já o "código FIX" corresponde ao valor 1588, também está no quarto campo e no segundo a string possui "MOV". Podemos assumir o valor do quarto campo apenas e esquecer esse detalhe ... Outro problema é a sua declaração de limite, você não diz se é limite mínimo, limite máximo ou qualquer combinação dos dois. Sem saber isto não tem como montar as condições para testar. Parece que o problema que você é bem simples de resolver, está apenas muito mal definido :P
Ops, não é o quarto campo, é o terceiro, equivoquei-me na interpretação e agora estou ainda com mais dúvidas. O que determina o tipo de "código" é o valor do terceiro campo? Por exemplo, "código MOV" é tudo a partir de 50000 (inclusive ou exclusive?) e "código FIX" é tudo abaixo de 1000 (inclusive ou exclusive?)?
10. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]
removidousa Nenhuma
Post recolhido
Enviado em 03/02/2015 - 19:50h
rpbiaggio escreveu:
Vamos lá...
Tenho essas duas linhas no arquivo
1|TCO.FIX.D120202.H000021|172867|
1|TCO.MOV.D120202.H000021|1588|
Para a linha que tem o código FIX o limite máximo é 1000 e minimo 5
Para linhas com o código MOV o limite máxima é 50000 e minimo 10
Eu disse que é o terceiro campo pois estou delimitando pelo |.
Espero ter explicado melhor agora.
Obs: Posso ter várias linhas MOV e também várias FIX
Obrigado.
Então,
- se no segundo começar com "TCO.FIX" => min=5, max=1000.
- se no segundo começar com "TCO.MOV" => min=10, max=50000.
No exemplo dado, somente a segunda linha está dentro do intervalo. Correto?
if [ "$Fix" -gt 50000 ]; then
echo "Limite maximo de CDRs para codigo FIX foi excedido - NOTOK $Fix"
exit
elif [ "$Fix" -lt 10 ]; then
echo "Limite minimo de CDRs para codigo FIX abaixo do esperado - NOTOK $Fix"
exit
else
echo "Limite maximo e minimo de CDRs para codigo FIX dentro do esperado - OK $Fix"
exit
fi
exit
Agora surgiu outra dúvida hahaha. Vou ter dois arquivos por dia. Preciso pensar como farei isso.