Localizar e excluir linhas repetidas em um arquivo texto
Publicado por Gabriel Fernandes (última atualização em 22/10/2009)
[ Hits: 29.020 ]
Homepage: http://cd2.com.br
Download 1255971739.limpa_duplicados.sh (versão 2)
Este script localiza linhas repetidas em determinado arquivo texto e cria um novo arquivo (ARQUIVO-SAIDA) sem as linhas repetidas, um arquivo somente com as linhas que repetem (ARQUIVO-DUPLICADOS) e por último um arquivo com o estatísticas do resultado (ARQUIVO-LOG).
Uso: ./limpa_duplicados.sh /caminho/do/arquivo caracteres início
Parâmetros:
- /caminho/do/arquivo = caminho completo do arquivo;
- caracteres = quantidade de caracteres que compõem a chave da linha (opcional, padrão=450);
- inicio = posição inicial da chave, começando em 0 - ZERO (opcional, padrão=0);
Exemplo: ./limpa_duplicados.sh arquivo.txt 450 0
Precisa de ajuda? Fale comigo!
gabriel@duel.com.br
Versão 2 - Enviado por Gabriel em 19/10/2009
Changelog: Mesmo resultado utilizando o programa AWK, obrigado pela sugestão SMarcell.
Fiz uma pequena alteração para ficar mais fácil de entender para quem não tem muito conhecimento do AWK:
SMarcell sugeriu: printf "$(awk '!i[$0]++' arquivo) \n" > arquivo
Alterado para: awk '{ if ( !umArrayLinhas[$0]++ ) { print $0 } }' arquivo > "arquivo"
Valeus!
Download 1255971739.limpa_duplicados.sh
#!/bin/bash
# limpa_duplicados - Copyright (C) 2009 Gabriel Fernandes <gabriel@duel.com.br>
if [ ! -f "$1" ] ; then
echo ""
echo "limpa_duplicados - Copyright (C) 2009 Gabriel Fernandes"
echo ""
echo "Use: $0 /caminho/do/arquivo caracteres inicio"
echo ""
echo "Parametros:"
echo "/caminho/do/arquivo = Caminho completo do arquivo;"
echo "caracteres = Quantidade de caracteres que compoem a chave da linha (opcional, padrao=450);"
echo "inicio = Posicao inicial da chave, comecando em 0 - ZERO (opcional, padrao=0);"
echo ""
echo "Exemplo: $0 arquivo.txt 450 0"
echo ""
echo "Precisa de ajuda? Fale comigo!"
echo "gabriel@duel.com.br"
echo ""
exit 1
fi
# Recebe caminho completo do arquivo para processar
ARQUIVO=$1
ARQUIVO_SAIDA="$ARQUIVO-SAIDA"
ARQUIVO_DUPLICADOS="$ARQUIVO-DUPLICADOS"
# Recebe parametros da chave
CARACTERES=$2
INICIO=$3
# apaga arquivo antigos ja processados
rm -rf "$ARQUIVO-SAIDA" "$ARQUIVO-DUPLICADOS"
# faz backup do arquivo original
cp "$ARQUIVO" "$ARQUIVO-ORIGINAL"
# Conta quantidade linha para processar
NUM_LINHAS=$(cat $ARQUIVO | wc -l)
let NUM_LINHAS++
# Inicia contadores
CONT_LINHAS_DUPLICADAS="0"
CONT_LINHAS_SAIDA="0"
CONT_LINHAS_PROCESSADAS="1"
while read LINHA ; do
# Carrega os primeiros X caracteres da linha, aqui neste ponto voce pode arrumar a precisao do teste
# aumentando ou diminuindo a quantidade de caracteres a ser testado na linha, o padrão quando omisso eh 450
if [ ! -f "$2" ] || [ ! -f "$3" ]; then
LINHA_ATUAL=${LINHA:0:450}
else
LINHA_ATUAL=${LINHA:$INICIO:$CARACTERES}
fi
# Verifica quantas vezes esta linha foi encontrada no arquivo
QTDE_LINHAS_LOCALIZADAS_ORIGINAL=$(grep "$LINHA_ATUAL" $ARQUIVO | wc -l)
if [ "$QTDE_LINHAS_LOCALIZADAS_ORIGINAL" == "1" ]; then
let CONT_LINHAS_SAIDA++
echo "$LINHA" >> $ARQUIVO_SAIDA
else
# Verifica se a linha repetida ja esta no arquivo novo
QTDE_LINHAS_LOCALIZADAS_NOVO=$(grep "$LINHA_ATUAL" $ARQUIVO_SAIDA | wc -l)
if [ "$QTDE_LINHAS_LOCALIZADAS_NOVO" == "0" ]; then
let CONT_LINHAS_DUPLICADAS++
let CONT_LINHAS_SAIDA++
echo "$LINHA" >> $ARQUIVO_SAIDA
echo "$LINHA" >> $ARQUIVO_DUPLICADOS
fi
fi
let CONT_LINHAS_PROCESSADAS++
clear
echo "Processando arquivo: $ARQUIVO"
echo "Registro:$CONT_LINHAS_PROCESSADAS de $NUM_LINHAS"
echo "Normal:$CONT_LINHAS_SAIDA Duplo:$CONT_LINHAS_DUPLICADAS"
done < $ARQUIVO
echo "Processado arquivo: $ARQUIVO" > $ARQUIVO-LOG
echo "Registro:$CONT_LINHAS_PROCESSADAS de $NUM_LINHAS" >> $ARQUIVO-LOG
echo "Normal:$CONT_LINHAS_SAIDA Duplo:$CONT_LINHAS_DUPLICADAS" >> $ARQUIVO-LOG
Removendo carácter especial de arquivos recursivamente
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Assinador JNLP do Site Portal da Nota Fiscal Eletrônica (4)
Warcraft II Remastered no Linux? (3)









