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)