comparar sequencias de caracteres [RESOLVIDO]

1. comparar sequencias de caracteres [RESOLVIDO]

Allysson jouglas Lima de oliveira
allysson01

(usa Ubuntu)

Enviado em 08/06/2018 - 19:26h

Olá tenho um arquivo txt cheques.txt ele tem uma sequencia de leitura que seria a seguinte
abre cheques
abre lote
fecha lote
fecha cheques

Uma saida do arquivo é essa

CHEQUES;A;
LOTE;A;0001
111111;68.56
111112;76.25
111223;89.65
112334;65.22
LOTE;F;0001;299.68
LOTE;A;0002
123456;10.29
123212;56.25
125653;19.28
LOTE;F;0002;1098.56
LOTE;A;0003
111223;10.99
123122;11.25
LOTE;F;0004;1234.23
CHEQUES;F;19922.23

sei como fazer em outrar linguagens mas preciso fazer em shell script, não entendi a sintaxe do split
a saida que seria a correta é essa

CHEQUES;A;
LOTE;A;0001
111111;68.56
111112;76.25
111223;89.65
112334;65.22
LOTE;F;0001;299.68 ==> lote ok valores ok
LOTE;A;0002
123456;10.29
123212;56.25
125653;19.28
LOTE;F;0002;1098.56 ==> lote ok valores não conferem
LOTE;A;0003
111223;10.99
123122;11.25
LOTE;F;0004;1234.23 ==> lote não confere, valor não confere
CHEQUES;F;19922.23 ==> valores de cheques nao confere

alguem poderia dar uma força ae


  


2. MELHOR RESPOSTA

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 09/06/2018 - 10:13h

Allysson,

Use o CUT com o IF.

Veja um exemplo do script que deve te atender.

#!/bin/bash

# Buscando informações no arquivo TXT
ARQUIVO=`cat cheques.txt`

# Exibir ou não exibir a informação de cada linha
# Alterar essa configurção entre: 1-Exibe ou 0-Não Exibe
EXIBIR="1"

#Variáveis
LOTE_ID=""
SOMA_LOTE=0
SOMA_LOTE_TXT=0
SOMA=0
SOMA_TXT=0

for linha in $ARQUIVO;
do
PARTE1=`echo $linha | cut -d';' -f 1`
PARTE2=`echo $linha | cut -d';' -f 2`

if [[ "$PARTE1" == "CHEQUES" ]]; then
if [[ "$PARTE2" == "A" ]]; then
SOMA_TXT=0
echo -e "\nABRINDO CHEQUES"
else
SOMA_TXT=`echo $linha | cut -d';' -f 3`
echo -e "FECHANDO CHEQUES"

echo -e "\nSOMA TOTAL = $SOMA"
echo -e "SOMA TOTAL NO ARQUIVO = $SOMA_TXT"

if [[ $SOMA == $SOMA_TXT ]]; then
echo -e "VALOR CHEQUES CONFEREM"
else
echo -e "VALOR CHEQUES NÃO CONFEREM"
fi
fi
elif [[ "$PARTE1" == "LOTE" ]]; then
if [[ "$PARTE2" == "A" ]]; then
LOTE_ID=`echo $linha | cut -d';' -f 3`
SOMA_LOTE=0
SOLA_LOTE_TXT=0
echo -e "\nABRINDO LOTE $LOTE_ID"
else
SOMA_LOTE_TXT=`echo $linha | cut -d';' -f 4`
echo -e "FECHANDO LOTE $LOTE_ID"
echo -e "SOMA DO LOTE = $SOMA_LOTE"
echo -e "SOLA DO LOTE NO ARQUIVO = $SOMA_LOTE_TXT"

if [[ $SOMA_LOTE == $SOMA_LOTE_TXT ]]; then
echo -e "VALORES CONFEREM"
else
echo -e "VALORES NÃO CONFEREM"
fi

echo -e "SOMA TOTAL = $SOMA"
fi
else
SOMA=`echo -e 'scale=2;'$SOMA'+'$PARTE2 | bc`
SOMA_LOTE=`echo -e 'scale=2;'$SOMA_LOTE'+'$PARTE2 | bc`
fi

if [[ "$EXIBIR" == "1" ]]; then
echo "> "$linha
fi
done

Abraço,
Diego M. Rodrigues

3. Re: comparar sequencias de caracteres [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 09/06/2018 - 19:18h

allysson01 escreveu:

Olá tenho um arquivo txt cheques.txt ele tem uma sequencia de leitura que seria a seguinte
abre cheques
abre lote
fecha lote
fecha cheques

Uma saida do arquivo é essa

CHEQUES;A;
LOTE;A;0001
111111;68.56
111112;76.25
111223;89.65
112334;65.22
LOTE;F;0001;299.68
LOTE;A;0002
123456;10.29
123212;56.25
125653;19.28
LOTE;F;0002;1098.56
LOTE;A;0003
111223;10.99
123122;11.25
LOTE;F;0004;1234.23
CHEQUES;F;19922.23

sei como fazer em outrar linguagens mas preciso fazer em shell script, não entendi a sintaxe do split
a saida que seria a correta é essa

CHEQUES;A;
LOTE;A;0001
111111;68.56
111112;76.25
111223;89.65
112334;65.22
LOTE;F;0001;299.68 ==> lote ok valores ok
LOTE;A;0002
123456;10.29
123212;56.25
125653;19.28
LOTE;F;0002;1098.56 ==> lote ok valores não conferem
LOTE;A;0003
111223;10.99
123122;11.25
LOTE;F;0004;1234.23 ==> lote não confere, valor não confere
CHEQUES;F;19922.23 ==> valores de cheques nao confere

alguem poderia dar uma força ae


Boa noite Allysson.
Segue sugestão:

#!/bin/bash
TT=0;
while read line;do
[[ $line =~ ^CHEQUES\;A\;$ ]] && echo $line;
[[ $line =~ ^LOTE\;A\;[0-9]+$ ]] && { total=0;read -a cp <<< $(sed 's/\;/ /g' <<< "$line");
echo ABRINDO LOTE ${cp[2]} ; };
[[ $line =~ ^[0-9]+\;[0-9]+ ]] && { read -a val0 <<< $(sed 's/\;/ /g' <<< "$line");
total=$total+"${val0[1]}" ;TT="$TT+${val0[1]}" ; echo $line ; };
[[ $line =~ ^LOTE\;F\;[0-9]+\;[0-9]+\.[0-9]+$ ]] && { read -a val1 <<< $(sed 's/\;/ /g' <<< "$line");
echo "Sub Total LOTE ${val1[2]}: $(bc <<< "$total")";
[[ $(bc <<< "$total") = ${val1[3]} ]] && stt="CONFERE" || stt="NÃO CONFERE";
echo "FECHA LOTE ${val1[2]} VALOR ${val1[3]} $stt" ;};
[[ $line =~ ^CHEQUES\;F\;[0-9]+\.[0-9]+$ ]] && { read -a val2 <<< $(sed 's/\;/ /g' <<< "$line");
[[ $(bc <<< "$TT") = ${val2[2]} ]] && stt="CONFERE" || { stt="NÃO CONFERE";
dif=$(awk '{print $2-$1}' <<< "$(bc <<< "$TT") ${val2[2]}");};
echo -e "\nFECHAMENTO GERAL: $stt\nCal: $(bc <<< "$TT") Inf: ${val2[2]}\nDiferença: $dif";};
done<cheques.txt

Saída:
CHEQUES;A;
ABRINDO LOTE 0001
111111;68.56
111112;76.25
111223;89.65
112334;65.22
Sub Total LOTE 0001: 299.68
FECHA LOTE 0001 VALOR 299.68 CONFERE
ABRINDO LOTE 0002
123456;10.29
123212;56.25
125653;19.28
Sub Total LOTE 0002: 85.82
FECHA LOTE 0002 VALOR 85.82 CONFERE
ABRINDO LOTE 0003
111223;10.99
123122;11.25
Sub Total LOTE 0003: 22.24
FECHA LOTE 0003 VALOR 22.24 CONFERE

FECHAMENTO GERAL: NÃO CONFERE
Cal: 407.74 Inf: 407.87
Diferença: 0.13

OBS.: Alterei o arquivo cheques.txt para obter esses resultados.
Marcelo Oliver


4. Re: comparar sequencias de caracteres [RESOLVIDO]

Allysson jouglas Lima de oliveira
allysson01

(usa Ubuntu)

Enviado em 10/06/2018 - 18:58h

Blza vou dar uma olhada aqui e respondo se deu boa :D






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts