Script paga apagar linha de txt [RESOLVIDO]

1. Script paga apagar linha de txt [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 25/05/2021 - 07:44h

Bom dia a todos, gostaria de uma ajuda para finalizar um script, não sei onde está o erro se puderem me ajudar? O Seguinte cenário.

LISTA.TXT
nome do arquivo 1.pdf
nome do arquivo 2.pdf
nome do arquivo 3.jpg
nome do arquivo4.jpeg
nome do arquivo 1.pdf
nome do arquivo 3.jpg


Tenho um script que encontra os duplicados e grava em txt chamado LISTAAPAGAR.TXT

LISTAAPAGAR.TXT
nome do arquivo 1.pdf
nome do arquivo 3.jpg

Fis o script shell para apgar as linahs no arquivo principal

cat LISTAAPAGAR.TXT | while read arquivo
do

sed -i '/'$arquivo/d' LISTA.txt

done


Ele apresenta essa saida, porém ao relatar aqui eu percebi que mesmo com o erro descrito abaixo ele apaga as linhas no txt

Mensagem apresentada:
sed: -e expressão #1, caractere 3: A expressão regular do endereço está inacabada (falta a /)






  


2. MELHOR RESPOSTA

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 25/05/2021 - 16:32h


brainnersilva escreveu:

Bom dia a todos, gostaria de uma ajuda para finalizar um script, não sei onde está o erro se puderem me ajudar? O Seguinte cenário.

LISTA.TXT
nome do arquivo 1.pdf
nome do arquivo 2.pdf
nome do arquivo 3.jpg
nome do arquivo4.jpeg
nome do arquivo 1.pdf
nome do arquivo 3.jpg


Tenho um script que encontra os duplicados e grava em txt chamado LISTAAPAGAR.TXT

LISTAAPAGAR.TXT
nome do arquivo 1.pdf
nome do arquivo 3.jpg

Fis o script shell para apgar as linahs no arquivo principal

cat LISTAAPAGAR.TXT | while read arquivo
do
sed -i '/'$arquivo/d' LISTA.txt
done

Ele apresenta essa saida, porém ao relatar aqui eu percebi que mesmo com o erro descrito abaixo ele apaga as linhas no txt

Mensagem apresentada:
sed: -e expressão #1, caractere 3: A expressão regular do endereço está inacabada (falta a /)

Boa tarde brainnersilva,
segue seu script funcionando:

#!/bin/bash
while read line;do
echo "Apagando Linha:$line" #PODE TIRAR ESTA LINHA
sed -i '/'${line}'/d' LISTA.txt
done<LISTAAPAGAR.TXT



______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________


3. Re: Script paga apagar linha de txt

Ryuk Shinigami
Ryuk

(usa Nenhuma)

Enviado em 25/05/2021 - 08:52h

brainnersilva escreveu:

sed -i '/'$arquivo/d' LISTA.txt
sed: -e expressão #1, caractere 3: A expressão regular do endereço está inacabada (falta a /)



No caso do SED as 'aspas simples' impedem a interpretação da variável $arquivo. O correto seria usar "aspas duplas". Além disso tem uma aspa sobrando aí na frente do $ (remova):
sed -i "/$arquivo/d" LISTA.txt 


MAS, para o que você precisa, não é necessário um script, bastaria um simples comando sort:
sort -u lista.txt -o lista.txt 

Fica a dica!


4. Re: Script paga apagar linha de txt

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/05/2021 - 02:56h

Faltam informações para ajudá-lo de modo mais efetivo.

Pelo código que você escreveu, você está tentando remover do arquivo original todas as ocorrências de linhas que possuem duplicidade, sem manter nem mesmo a primeira vez em que cada uma delas ocorre. É isso mesmo que você quer?

Eu acho improvável que seja, porque normalmente os problemas de remover repetições não incluem apagar a primeira ocorrência. No entanto, se você quiser realmente isso, a sugestão do nosso colega Ryuk não serve. A do colega msoliver, que é a uma correção da sua, funcionaria, mas seria sub-ótima por potencialmente gerar várias versões intermediárias do arquivo, pois você vai chamar o sed tantas vezes quantas linhas houver em LISTAAPAGAR.TXT. E, além dessa questão de desempenho, essa versão pode dar problema se o argumento passado ao sed contiver caracteres que confundam seu analisador léxico, tais como “/” ou qualquer dos caracteres usados para formar expressões regulares. Por isso, eu creio que a forma mais simples e eficiente de obter o mesmo efeito seria usar fgrep.
fgrep -v -x -f LISTAAPAGAR.TXT LISTA.TXT 


Se, por outro lado, você não quiser realmente apagar a primeira ocorrência de cada arquivo, seu script original e a correção apresentada pelo colega msoliver padecem do mesmo erro. A solução do Ryuk, nesse caso, seria a forma mais simples de fazer, de você não se importar de eventualmente trocar a ordem das linhas do arquivo original.

Se não puder apagar as primeiras ocorrências nem trocar a ordem das linhas do arquivo original, a coisa fica um pouco mais difícil, mas apenas um pouco. Uma maneira de fazer é usando arrays associativos, quer os nativos do Bash, quer os do awk: para cada linha que você ler, verifica se já existe no array associativo; se não existir, imprime a linha e a coloca no array.
awk '{ if(! ($0 in reps)){ print $0; reps[$0]++; } }' 
declare -A rep; while read a; do if (( \!rep[$a] )); then echo "$a"; ((++rep[$a])); fi; done 



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


5. Re: Script paga apagar linha de txt [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 26/05/2021 - 09:05h

Bom dia obrigado pelo retorno, eu tentei dessa maneira, porém a lista que vou apagar não e só de arquivos que estão duplicados, por isso que acho que com o sort não iria dar certinho.

Ryuk escreveu:

brainnersilva escreveu:

sed -i '/'$arquivo/d' LISTA.txt
sed: -e expressão #1, caractere 3: A expressão regular do endereço está inacabada (falta a /)



No caso do SED as 'aspas simples' impedem a interpretação da variável $arquivo. O correto seria usar "aspas duplas". Além disso tem uma aspa sobrando aí na frente do $ (remova):
sed -i "/$arquivo/d" LISTA.txt 


MAS, para o que você precisa, não é necessário um script, bastaria um simples comando sort:
sort -u lista.txt -o lista.txt 

Fica a dica!





6. Re: Script paga apagar linha de txt [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 26/05/2021 - 09:08h

Bom dia agradeço sua resposta... dessa forma funcionou perfeito, tive que adicionar somente um " " no $line onde vai o nome do arquivo e funcionou perfeitamente.. obrigado!

#!/bin/bash
while read line;do
echo "Apagando Linha:$line" #PODE TIRAR ESTA LINHA
sed -i '/'"${line}"'/d' LISTA.txt
done<LISTAAPAGAR.TXT




msoliver escreveu:


brainnersilva escreveu:

Bom dia a todos, gostaria de uma ajuda para finalizar um script, não sei onde está o erro se puderem me ajudar? O Seguinte cenário.

LISTA.TXT
nome do arquivo 1.pdf
nome do arquivo 2.pdf
nome do arquivo 3.jpg
nome do arquivo4.jpeg
nome do arquivo 1.pdf
nome do arquivo 3.jpg


Tenho um script que encontra os duplicados e grava em txt chamado LISTAAPAGAR.TXT

LISTAAPAGAR.TXT
nome do arquivo 1.pdf
nome do arquivo 3.jpg

Fis o script shell para apgar as linahs no arquivo principal

cat LISTAAPAGAR.TXT | while read arquivo
do
sed -i '/'$arquivo/d' LISTA.txt
done

Ele apresenta essa saida, porém ao relatar aqui eu percebi que mesmo com o erro descrito abaixo ele apaga as linhas no txt

Mensagem apresentada:
sed: -e expressão #1, caractere 3: A expressão regular do endereço está inacabada (falta a /)

Boa tarde brainnersilva,
segue seu script funcionando:

#!/bin/bash
while read line;do
echo "Apagando Linha:$line" #PODE TIRAR ESTA LINHA
sed -i '/'${line}'/d' LISTA.txt
done<LISTAAPAGAR.TXT



______________________________________________________________________
Importante: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p'
Att.: Marcelo Oliver
______________________________________________________________________
Nota de esclarecimento:
O comando: lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p',
faz parte da minha assinatura.
O qual, "filtra" a página: "https://www.vivaolinux.com.br/termos-de-uso/",
Mostrando o seguinte:

Se você sanou sua dúvida ou resolveu um problema a partir de um
tópico criado, é extremamente recomendável que acesse o tópico e
marque-o como "RESOLVIDO". E mais recomendável ainda que você eleja
como melhor resposta a que mais lhe ajudou.


______________________________________________________________________





7. Re: Script paga apagar linha de txt [RESOLVIDO]

BRAINNER ROGER PIRES DA SILVA
brainnersilva

(usa CentOS)

Enviado em 26/05/2021 - 09:17h


Bom dia, agradeço muito sua resposta, realmente eu optei por apagar todas as linhas que contenham a informação, pois eu gravo em um txt para o usuario verificar e fazer manual se for o caso...

Eu tentei usar o fgrep mais ele só listou o arquivo e não apagou as linhas..

já o awk eu não me atrevi a tentar, pois não comprrendi o uso dele direito ainda...

Mais de qualquer forma obrigado eu optei em usar o scrip que o colega ajudou a arrumar...

Valeu demais!


paulo1205 escreveu:

Faltam informações para ajudá-lo de modo mais efetivo.

Pelo código que você escreveu, você está tentando remover do arquivo original todas as ocorrências de linhas que possuem duplicidade, sem manter nem mesmo a primeira vez em que cada uma delas ocorre. É isso mesmo que você quer?

Eu acho improvável que seja, porque normalmente os problemas de remover repetições não incluem apagar a primeira ocorrência. No entanto, se você quiser realmente isso, a sugestão do nosso colega Ryuk não serve. A do colega msoliver, que é a uma correção da sua, funcionaria, mas seria sub-ótima por potencialmente gerar várias versões intermediárias do arquivo, pois você vai chamar o sed tantas vezes quantas linhas houver em LISTAAPAGAR.TXT. E, além dessa questão de desempenho, essa versão pode dar problema se o argumento passado ao sed contiver caracteres que confundam seu analisador léxico, tais como “/” ou qualquer dos caracteres usados para formar expressões regulares. Por isso, eu creio que a forma mais simples e eficiente de obter o mesmo efeito seria usar fgrep.
fgrep -v -x -f LISTAAPAGAR.TXT LISTA.TXT 


Se, por outro lado, você não quiser realmente apagar a primeira ocorrência de cada arquivo, seu script original e a correção apresentada pelo colega msoliver padecem do mesmo erro. A solução do Ryuk, nesse caso, seria a forma mais simples de fazer, de você não se importar de eventualmente trocar a ordem das linhas do arquivo original.

Se não puder apagar as primeiras ocorrências nem trocar a ordem das linhas do arquivo original, a coisa fica um pouco mais difícil, mas apenas um pouco. Uma maneira de fazer é usando arrays associativos, quer os nativos do Bash, quer os do awk: para cada linha que você ler, verifica se já existe no array associativo; se não existir, imprime a linha e a coloca no array.
awk '{ if(! ($0 in reps)){ print $0; reps[$0]++; } }' 
declare -A rep; while read a; do if (( \!rep[$a] )); then echo "$a"; ((++rep[$a])); fi; done 



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)