Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

13. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 31/03/2016 - 10:53h

paulo1205 escreveu:

Sacanagem ter de chegar para o Xerxes com aquele discurso de que “geralmente é considerado impróprio ficar pedindo resposta pronta em fórum público, e isso não se aplica apenas ao VoL, mas a fóruns na Internet em geral, etc. etc. etc.”

A que ponto nós chegamos?! Tudo culpa do PT!! ;)


Brincadeiras à parte, a solução é simples: use arrays associativos na sua linguagem favorita.


kkk valeu! Queria evitar arrays, mas qualquer coisa eu volto a considerar.

--
https://goo.gl/uu8OUX


  


14. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 31/03/2016 - 10:57h

Williamm escreveu:

Buenas, da pra fazer algo assim..


#!/bin/bash
for i in $( cat lista.txt)
do
if [ $(cat lista2.txt | grep "$i" ) 2> /dev/null -z ]; then
echo "$i - nao existe"
echo "$i" >> lista2.txt
else
echo "$i - existe"
fi
done


Deve ser algo por aí... embora esse não funcione, vou tentar adaptá-lo. Valeu.

--
https://goo.gl/uu8OUX


15. Re: Deletar frase em lista (1ª ocorrência)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 31/03/2016 - 10:58h

Em Perl:

while(<>){
if(exists($frase{$_})){
print $_;
}
else {
$frase{$_}=1;
}
}



Em Perl, como one-liner:

perl -ne 'if(exists($frase{$_})){ print $_; } else { $frase{$_}=1; }' 



Em bash:

declare -A frase
while read a; do
if [[ -z "${frase[$a]+1}" ]]; then
echo "$a"
else
frase[$a]=""
fi
done



16. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

William Amaral de Souza
Williamm

(usa Linux Mint)

Enviado em 31/03/2016 - 11:01h

Até funciona, so realmente tem que adaptar pra ti, depois posta ai como ficou..


17. Re: Deletar frase em lista (1ª ocorrência)

Wellington
wellington_r

(usa Debian)

Enviado em 31/03/2016 - 11:12h

Se você não puder alterar a ordem das linhas, dá pra você fazer um arquivo auxiliar com o uniq (como falaram anteriormente), pra conter todas as frases do arquivo original (uma única vez cada). Depois você faz o loop para percorrer esse arquivo auxiliar. Nesse loop, você pode usar o sed pra substituir* sempre a primeira ocorrência da frase atual no seu arquivo original.

O comando sed é:
sed '0,/RE/{//d;}' file 


Onde "RE" deve ser substituído pelo conteúdo da linha atual do loop.

Como visto em: http://www.linuxtopia.org/online_books/linux_tool_guides/the_sed_faq/sedfaq4_004.html

*correção: deletar


18. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 31/03/2016 - 11:24h

Obrigado a todos pelas ideias!

Vou dar uma estudada em cada uma e ver o que sai!

Abraço!
--
https://goo.gl/uu8OUX


19. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 31/03/2016 - 11:32h

xerxeslins escreveu:

Olá scriptudos. Tenho um arquivo com várias linhas. Cada linha uma frase.

exemplo:
banana nanica
maçã argentina
laranja mimo
banana nanica
laranja mimo

Perceba que há frases que aparecem duas vezes na lista. Que comando eu uso para remover apenas a primeira ocorrência de uma frase? (repetida ou não).
Obrigado.

------------------------------------------------------------------------------
Bom dia xerxeslins.
Verifique se atende . . .
Código:
sort frases |uniq -c|sed 's/^[ ]\+//' > frases-temp
while IFS=" " read -r A B C;do
for ((x=0;x<$((A-1));x++));do
(($A>1)) && echo $B $C
done
done < frases-temp

Saída:
banana nanica
laranja mimo


É isso?

----------------------------------------------------------------------------------------
Se resolver, marque como resolvido, por favor.
Gostando da resposta, marque-a como a MELHOR, dessa forma, ganho uns pontinhos,
o que incentiva a continuar colaborando, ajudando, participando e compartilhando conhecimentos . . . :)
----------------------------------------------------------------------------------------
Abç.:
Marcelo





20. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 31/03/2016 - 11:37h

Williamm escreveu:

Até funciona, so realmente tem que adaptar pra ti, depois posta ai como ficou..


Obrigado. Adaptei a sua solução e o resultado ficou assim:

#!/bin/bash 
VAR=0
_removedor() {

while read line
do
if [ "$line" == "$1" ] && [ $VAR -eq 0 ]
then
echo "saiu $line"
VAR=1
else
echo "$line" >> lista2.txt
fi
done < lista.txt
}

_removedor "banana nanica"


Nesse caso se eu usar o script, ele não envia o "banana nanica" para o arquivo lista2.txt (só uma vez, a primeira ocorrência), depois disso ele enviar o resto para lista2.txt. Ou seja, remove só a primeira ocorrência.

Obrigado pela ajuda!

Vi que outras pessoas aqui tiveram ideias de soluções bem mais elegantes. Agradeço a todos.
--
https://goo.gl/uu8OUX

--
https://goo.gl/uu8OUX


21. Re: Deletar frase em lista (1ª ocorrência)

Wellington
wellington_r

(usa Debian)

Enviado em 31/03/2016 - 11:44h

xerxeslins escreveu:

Obrigado. Adaptei a sua solução e o resultado ficou assim:

#!/bin/bash 
VAR=0
_removedor() {

while read line
do
if [ "$line" == "$1" ] && [ $VAR -eq 0 ]
then
echo "saiu $line"
VAR=1
else
echo "$line" >> lista2.txt
fi
done < lista.txt
}

_removedor "banana nanica"


Nesse caso se eu usar o script, ele não envia o "banana nanica" para o arquivo lista2.txt (só uma vez, a primeira ocorrência), depois disso ele enviar o resto para lista2.txt. Ou seja, remove só a primeira ocorrência.

Obrigado pela ajuda!

Vi que outras pessoas aqui tiveram ideias de soluções bem mais elegantes. Agradeço a todos.
--
https://goo.gl/uu8OUX

--
https://goo.gl/uu8OUX



Eu achei que você precisasse executar esse script para CADA frase diferente existente no arquivo.



22. Re: Deletar frase em lista (1ª ocorrência)

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 31/03/2016 - 11:46h

Um amigo do VOL deu esta solução:

sed -i '0,/laranja mimo/s/laranja mimo//' file

e isso resolve.

Só que fica uma linha em branco no arquivo (onde tinha a frase).

Apenas para efeito de consulta!


Esse amigo foi: https://www.vivaolinux.com.br/~hellnux

Depois outro amigo incrementou e tirou a linha em branco deixando o comando final assim:

sed -i -e '0,/laranja mimo/s/laranja mimo//' -e '/^$/d' file

Aí foi o Lcavalheiro (https://www.vivaolinux.com.br/~lcavalheiro).

Funciona perfeitamente. O último comando é o melhor.

Obrigado a todos!
--
https://goo.gl/uu8OUX


23. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/03/2016 - 11:48h

paulo1205 escreveu:

Em Perl:

while(<>){
if(exists($frase{$_})){
print $_;
}
else {
$frase{$_}=1;
}
}



Em Perl, como one-liner:

perl -ne 'if(exists($frase{$_})){ print $_; } else { $frase{$_}=1; }' 



Em bash:

declare -A frase
while read a; do
if [[ -z "${frase[$a]+1}" ]]; then
echo "$a"
else
frase[$a]=""
fi
done


Estas soluções parecem ser muito boas e simples.

----------------------------------------------------------------------------------------------------------------
# apt-get purge systemd (não é prá digitar isso!)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



24. Re: Deletar frase em lista (1ª ocorrência) [RESOLVIDO]

Xerxes
xerxeslins

(usa openSUSE)

Enviado em 31/03/2016 - 12:15h

Comando mais simples por Elder do VOL:

sed '0,/banana nanica/ { /banana nanica/ d }' file 


esse está sendo o melhor.

https://www.vivaolinux.com.br/~eldermarco

--
https://goo.gl/uu8OUX



01 02 03



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts