Localizar e excluir linhas repetidas em um arquivo texto
Publicado por Gabriel Fernandes (última atualização em 22/10/2009)
[ Hits: 29.216 ]
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
Configurando CISCO por Shell Script
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Faça suas próprias atualizações de pacotes/programas no Void Linux e torne-se um Contribuidor
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Utilizando a Ferramenta xcheckrestart no Void Linux
Pisando no acelerador do Linux Mint: Kernel XanMod, zRAM e Ajustes de Swap
Como compilar kernel no Linux Mint
Abrir um arquivo URL pelo Clipper (9)
Seno, Coseno, Tangente em CLIPPER (1)
Inserir uma URL num arquvo pelo Ubuntu (CLIPPER) (0)
VMWare Player não conecta na rede nem consigo intercambiar arquivos (1)









