Localizar e excluir linhas repetidas em um arquivo texto
Publicado por Gabriel Fernandes (última atualização em 22/10/2009)
[ Hits: 28.677 ]
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
Execução remota com SSH e HERE DOCUMENTS descomplicada
Gerenciamento com firewalld no CentOS 7
Filtrando processos facilmente com psaux ( ps aux + grep + wc -l)
Inventário e Análise de hardware
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Encontre seus arquivos facilmente com o Drill
Mouse Logitech MX Ergo Advanced Wireless Trackball no Linux
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Instalação do drive do adaptador wiffi (3)
atualizar o linux com o comando apt update (11)