Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]

1. Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]

Rodrigo
rpbiaggio

(usa Outra)

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.

Obrigado.


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/02/2015 - 14:57h

rpbiaggio escreveu:

Opa, obrigado pela ajuda mas eu consegui ontem da forma abaixo:


Fix=$(grep -i ".FIX." $MascaraVozTV1 | cut -d "|" -f3);

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):


rules[${#rules[*]}]='FIX TCO.FIX. 10 50000'
rules[${#rules[*]}]='MOV TCO.MOV. 5 1000'

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]

Phillipe Smith
smithux

(usa Arch Linux)

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]

Perfil removido
removido

(usa Nenhuma)

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]

Rodrigo
rpbiaggio

(usa Outra)

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.

0|20140321130000
1|TCO.FIX.D120202.H000021|172867|2|2|TCO.PSFD.NETERRO.FIX.D140321.H104629|4|2|SCOMPTELIT_FVOICE_ID000036_T20140321104905_MBRAZIL_ANET.DAT|172857|21/03/2014 10:30:32|21/03/2014 10:49:40
1|TCO.MOV.D120202.H000021|1588|1|1|TCO.PSFD.NETERRO.MOV.D140321.H103044|4|1|SCOMPTELIT_FVOICE_ID000034_T20140321103057_MBRAZIL_ANET.DAT|1581|21/03/2014 10:30:32|21/03/2014 10:30:57
9|2


Obrigado




6. Não tenho o código

Rodrigo
rpbiaggio

(usa Outra)

Enviado em 03/02/2015 - 17:43h

Eu ainda não iniciei o código.

Não tenho ideia de como vou fazer essas validações.


7. Re: Guardar $3 de cada linha em variaveis diferentes [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

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.

0|20140321130000
1|TCO.FIX.D120202.H000021|172867|2|2|TCO.PSFD.NETERRO.FIX.D140321.H104629|4|2|SCOMPTELIT_FVOICE_ID000036_T20140321104905_MBRAZIL_ANET.DAT|172857|21/03/2014 10:30:32|21/03/2014 10:49:40
1|TCO.MOV.D120202.H000021|1588|1|1|TCO.PSFD.NETERRO.MOV.D140321.H103044|4|1|SCOMPTELIT_FVOICE_ID000034_T20140321103057_MBRAZIL_ANET.DAT|1581|21/03/2014 10:30:32|21/03/2014 10:30:57
9|2


Obrigado



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

Rodrigo
rpbiaggio

(usa Outra)

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]

Perfil removido
removido

(usa Nenhuma)

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.

0|20140321130000
1|TCO.FIX.D120202.H000021|172867|2|2|TCO.PSFD.NETERRO.FIX.D140321.H104629|4|2|SCOMPTELIT_FVOICE_ID000036_T20140321104905_MBRAZIL_ANET.DAT|172857|21/03/2014 10:30:32|21/03/2014 10:49:40
1|TCO.MOV.D120202.H000021|1588|1|1|TCO.PSFD.NETERRO.MOV.D140321.H103044|4|1|SCOMPTELIT_FVOICE_ID000034_T20140321103057_MBRAZIL_ANET.DAT|1581|21/03/2014 10:30:32|21/03/2014 10:30:57
9|2


Obrigado



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]

Perfil removido
removido

(usa Nenhuma)

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?

Usando awk (forma abreviada):

awk -F\| '(index($2, "TCO.FIX") == 1 && $3 >= 5 && $3 <= 1e3) || (index($2, "TCO.MOV") == 1 && $3 >= 10 && $3 <= 5e4)' arquivo 




11. Re: Guardar $3 de cada linha em variaveis diferentes

Rodrigo
rpbiaggio

(usa Outra)

Enviado em 04/02/2015 - 12:22h

Opa, obrigado pela ajuda mas eu consegui ontem da forma abaixo:


Fix=$(grep -i ".FIX." $MascaraVozTV1 | cut -d "|" -f3);

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,






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts