Substituição de caracteres [RESOLVIDO]

1. Substituição de caracteres [RESOLVIDO]

Diogo
diogo.arsego

(usa Ubuntu)

Enviado em 02/12/2015 - 16:40h

Olá, estou com um problema em uma base de dados e gostaria de algumas sugestões.
Meu arquivo de textos fornece dados de total anual precipitado. O grande problema é que a base de dados usa o mesmo caractere para separar o milhar e o decimal.
Desta forma, tenho dados parecidos com os listados abaixo.

1.597.35
840.20
1.200

O grande problema é que eles não possuem um padrão. Dependendo do total acumulado, ora o primeiro ponto pode indicar o milhar, ora o decimal. Gostaria de eliminar apenas o ponto do milhar, deixando meus dados da seguinte forma.

1597.35
840.20
1200

Alguma sugestão?
Grato pela atenção.


  


2. Re: Substituição de caracteres

thinomar
thinomar

(usa Linux Mint)

Enviado em 02/12/2015 - 18:06h

Montei um comando em awk, mas antes de aplicá-lo nos arquivos reais, teste, pois não me responsabilizo por danos ou perda de dados. Outra coisa importante citar é que parti da premissa de que os arquivos contém apenas os números, sem texto nem nada. Se este não for o caso, ajuste o comando ao seu caso.

arquivo_numeros.txt:
123.455.342.3434
3423.234.234.23.423.4
234.234.234.23.423.4.234
23.4
2.34
1.234
1.23.4
23.4
23.23
4.234234.23

Comando:
awk -F. '{numero=""; for(i=1;i<NF;i++){numero=numero$(i);} print numero"."$(NF);}' ./arquivo_numeros.txt 

Saída:
123455342.3434
342323423423423.4
234234234234234.234
23.4
2.34
1.234
123.4
23.4
23.23

--
-I've been talking to the main computer
-And...?
-It hates me


3. RESP: Tópico: Substituição de caracteres

Marcelo Oliver
msoliver

(usa Debian)

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

Boa noite, diogo.arsego

#RETIRA OS SEPARADORES DE MILHAR.
echo "123.455.342.34" | rev | sed 's/\.//2g'|rev
123455342.34
Troca "." por ","
sed 's/\./,/' <<< "123455342.34"
123455342,34

ARQUIVO INICIAL:
cat ARQ.txt
123.455.342.34
3.423.234.234.232.423.40
234.234.234.230.423.234.50
23.45
2.34
1.234.55
1.23
23.4
23.23
4.234.234.23

Uma outra opção, seria tirar todos o PONTOS
sed -i 's/\.//g' ARQ.txt

Depois,

while IFS=$'\n' read -r line || [[ -n $line ]];do
sed 's/\([0-9]\{2\}$\)/,&/' <<< "$line" >> NOVOARQ.txt
done < ARQ.txt

cat NOVOARQ
123455342,34
3423234234232423,40
234234234230423234,50
23,45
2,34
1234,55
1,23
2,34
23,23
4234234,23

Espero que seja útil.....
Abç.:
Marcelo








4. R: Substituição de caracteres

Diogo
diogo.arsego

(usa Ubuntu)

Enviado em 03/12/2015 - 09:50h

Olá usuários, obrigado pelas sugestões.

O meu grande problema é a falta de padronização dos dados. Acredito que as duas sugestões funcionariam em um conjunto de dados padronizados, mas não é meu caso.

Percebi que o primeiro utiliza como referência o último ponto para definir o decimal e o segundo trabalha com duas casas após a vírgula.

Acontece que, alguns dos meus dados (quando inteiros) possuem apenas a separação do milhar e, por isso não estou conseguindo definir o critério para substituição.

Como exemplo, o número 1.200 corresponde a 1200 e 1.200.01 corresponde a 1200,01, ou seja, nem sempre a casa decimal estará presente nesses dados.

Att.



5. Re: Substituição de caracteres [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

Enviado em 03/12/2015 - 12:56h

Ok... Só para tentar entender: Os arquivos possuem apenas números ou possuem outros dados também? Sobre o padrão de possuir decimal ou não, todos os números que possuem decimal, tem precisão de apenas dois dígitos decimais sempre? O decimal tem que ser separado por ponto mesmo ou há a necessidade de substituir por vírgula?
--
-I've been talking to the main computer
-And...?
-It hates me


6. Re: Substituição de caracteres

Diogo
diogo.arsego

(usa Ubuntu)

Enviado em 03/12/2015 - 15:45h

Olá, respondendo as perguntas anteriores.

No começo do arquivo há algumas linhas de texto com informações a respeito dos dados, mas posso excluí-las sem problemas.

Entre os dados, há a variável data, onde os números são separados por barra, não sei se isso é um problema.

Quanto aos decimais, sim, toda vez que aparece a casa decimal, ela possui precisão de duas casas.

Quanto a vírgula, os dados originais usam a vírgula como separação para o milhar e o decimal, mas para mim independe o formado de saída.

Att.



7. Re: Substituição de caracteres [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

Enviado em 04/12/2015 - 16:38h

Tá aí. Caso queira gravar as alterações em um novo arquivo, basta colocar o redirecionador ">" (write) ou ">>" (append) após o comando e o nome do novo arquivo. Exemplo:
./script.sh /home/fulano/test.txt >> new_test.txt 

#!/bin/bash
# Criado por: Thiago Martins (thinog)

if [ -z $1 ]
then
echo "Faltando argumento 'arquivo'"
echo "Uso:\n\t./script.sh /caminho/arquivo.txt"
exit 1
fi

arq=$1

while read linha
do
if [[ "$linha" =~ ^[0-9\.]+$ ]]
then
tamanho_decimal=`echo "$linha" | awk -F. '{print length($(NF))}'`
if [ "$tamanho_decimal" -le 2 ]
then
echo "$linha" | awk -F. '{numero=""; for(i=1;i<NF;i++){numero=numero$(i);} print numero"."$(NF);}'
else
echo "$linha" | sed 's/\.//g'
fi
else
echo $linha
fi
done < $arq

--
-I've been talking to the main computer
-And...?
-It hates me


8. RESP: Tópico: Substituição de caracteres

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/12/2015 - 15:46h

Thiago Martins, boa tarde.
Muito bom seu script.
Porém, fiz uns testes e notei que o mesmo transforma Nº inteiro com 01 ou 02 digitos em Nº decimal . . .
Tambem alterei para que deixe no padrão, se é inteiro, coloca ".00"
E se "tamanho_decimal" > 2,
Limpa pontuação e põe ".00"
Segue com as alterações:

#!/bin/bash
# Criado por: Thiago Martins (thinog)

if [ -z $1 ];then
echo "Faltando argumento 'arquivo'"
echo -e "Uso:\n./script.sh /caminho/arquivo.txt"
exit 1
elif [ $1 ];then arq=$1
fi

while read linha;do
#Alterado para "casar" somente linha com "."
if [[ "$linha" =~ [.]+ ]];then
tamanho_decimal=`awk -F. '{print length($(NF))}' <<< "$linha"`
if (("$tamanho_decimal" == 0 ));then
sed 's/$/\.00/' <<< "$linha"
elif (("$tamanho_decimal" > 2));then
sed 's/\.//g' <<< "$linha"|sed 's/$/\.00/'
elif (("$tamanho_decimal" == 2));then
awk -F. '{numero=""; for(i=1;i<NF;i++){numero=numero$(i);} print numero"."$(NF);}' <<< "$linha"
fi
else
echo $linha
fi
done < $arq

Abç.:
Marcelo





9. Re: Substituição de caracteres [RESOLVIDO]

thinomar
thinomar

(usa Linux Mint)

Enviado em 07/12/2015 - 15:47h

Muito bom saber que seu problema foi solucionado! :D
--
-I've been talking to the main computer
-And...?
-It hates me






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts