Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

1. Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 02/02/2011 - 11:43h

Amigos estou tentando remover determinadas linhas de um arquivo muito grande. Como as linhas contém números e pontos, a pesquisa pela linha desejada é realizada pelo grep. Para vocês entenderem melhor a fim de me ajudar segue abaixo a sequência de comandos que estou utilizando:

Primeiramente supondo que eu possua o arquivo teste.txt com o seguinte conteúdo:
linha1 23.456.321
linha2 45.6555555
linha3 090.32132323
linha4 7.045

Vamos supor que eu deseje excluir a linha3, seguem 2 procedimentos que eu estou tentando fazer mas não dá certo:

for i in `cat teste.txt | grep "090\.32132323"`; do sed -i '/$i/Id' teste.txt; done

# Como não deu certo pensei, bom o sed interpreta o ponto '.' como um símbolo neste caso deve ser usado o parâmetro \. Foi o que tentei mas também não deu certo:

sed "s/\./\\\\./g" teste.txt > aux.txt # substitui tudo que contém ponto '.' para '\.'
Ex: 090.32132323 para 090\.32132323 assim o sed deve aceitar pensei eu.
for i in `cat aux.txt`; do sed -i '/$i/Id' teste.txt; done

Nada disso deu certo e conferi os comandos e a lógica tá certa. Alguém tem idéia de por que não está funcionando e fazendo o que desejo?


  


2. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Daniel Miyagi
j4p0n3g0

(usa Debian)

Enviado em 02/02/2011 - 13:29h

sei fazer isso de 3 formas ...
espero que isso te ajude ...

==============================================
root@Miyagi:~# sed '/090\.32132323/d' script.teste
23.456.321
45.6555555
4 7.045
==============================================
root@Miyagi:~# grep -v "090\.32132323" script.teste
23.456.321
45.6555555
4 7.045
==============================================
root@Miyagi:~# sed '3d' script.teste
23.456.321
45.6555555
4 7.045
==============================================

Obs: nunca faça isso!
ex: sed '3d' script.teste > script.teste



3. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 02/02/2011 - 13:58h

Infelizmente não ajudou pois o sed não está completando os comandos dentro do laço. Pois preciso que ele rode com o for e não está funcionando de nenhum desses jeitos.


4. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Daniel Miyagi
j4p0n3g0

(usa Debian)

Enviado em 02/02/2011 - 14:06h

não entendi o pq do for no comando ...
cola a linha de comando que vc esta tentando executar e especificar oque vc está tentando fazer ...




5. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 02/02/2011 - 14:40h

Cara ... eu também não entendi sua lógica não ... mas um toque ... ao invés de:

sed -i '/$i/d'
use
sed -i "/$i/d"

pois se não o seu $i não será resolvido

Agora ... explica melhor o resto ... que sabe posso ajudar mais ....

boa sorte


6. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 02/02/2011 - 15:15h

Ok então explicando melhor.

Na realidade o arquivo sobre o qual desejo rodar o sed é um arquivo extenso e com muitas linhas a serem modificadas. Por isso pensei no for.

Eu desejo remover várias linhas diferentes ao mesmo tempo. Vou explicar como é meu arquivo.
Possuo um arquivo texto.xml que contém resultados de cálculos de médias de desempenho de um computador qualquer. Este arquivo é usado para gerar gráficos, mas enfim para não enrolar muito a história,... as vezes os gráficos atingem valores altos (picos) e o gráfico fica ruim. Para mim resolver este problema eu gostaria de eliminar os picos, mas para isto eu necessito localizá-los. Geralmente os filtro por data, mas quero filtrá-los por data E por valor. Vide abaixo e compreenderás melhor.

for i in `cat texto.xml | grep 2011-02-02 | awk '{print $2}' | grep "32\.45"`; do echo $i >> temp; done
#filtra primeiro por data, depois pela coluna em que está o resultado do cálculo do dia, depois pelo resultado do cálculo; assim irá listar todas as linhas que contém esta string e colocá-las no arquivo temp. As linhas serão diferentes pois no arquivo texto.xml há números que possuem mais casas decimais depois da vírgula, portanto tudo que tiver 32\.45 será considerado.

Após encontradas todas as linhas a serem removidas:

for i in `cat temp`; do sed -i '/$i/Id' texto.xml

Deveria remover mas não dá certo. Já tentei converter tudo o que é ponto . para \. mas mesmo assim não remove. E o comando está correto, pois não dá erro ao executar.

Alguém tem idéia de por que o sed não obedece aos comandos quando ele é usado dentro do for?




7. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Sergio Teixeira - Linux User # 499126
Teixeira

(usa Linux Mint)

Enviado em 02/02/2011 - 15:57h

Acho uma temeridade usar laços repetitivos para deletar ou modificar qualquer coisa em arquivos "vivos", pois qualquer errinho poderá ter consequências bem graves.

Sugiro que você faça cópia(s) de seu arquivo, grave com nome(s) bem diferente(s) e faça os testes sobre a(s) cópia(s) e JAMAIS sobre o original.
Assim, quando você descobrir a sintaxe 100% correta poderá finalmente executá-la com segurança sobre o arquivo original, já na certeza de que o resultado será o esperado.


8. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Daniel Miyagi
j4p0n3g0

(usa Debian)

Enviado em 02/02/2011 - 16:28h

ainda não entendi o "for" cara ...
vc utilizando o "grep -v" vc ja consegue esse resultado ...

cola um trexo do arquivo pra nos e mostre oque vc quer fazer ...


9. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 02/02/2011 - 16:28h

Você tentou o que eu sugeri ... trocar as aspas simples por aspas duplas? não funcionou?


10. Re: Porque este comando não funciona se a lógica está correta? [RESOLVIDO]

Mestre Kame
mlgrassi

(usa Debian)

Enviado em 02/02/2011 - 16:36h

Aleluia, funcionou. Segui seu conselho e removi as ' ' e substituí por " " Eu achava que as aspas simples faziam parte do sed. Eu já sabia da manha das aspas duplas e das simples mas não me liguei nisso.

Muito obrigado, foi de grande ajuda a sua dica.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts