Como remover linhas duplicadas de um arquivo?

0

Arquivo,

TABLE1  
-------  
1234

TABLE1  
-------  
9555  

TABLE1  
-------  
87676  

TABLE1
-------  
2344

Eu quero a saída como

TABLE1  
-------  
1234
9555  
87676
2344
    
por pmaipmui 06.05.2016 / 11:16

5 respostas

2

Aqui está um forro, usando sed e awk :

sed '/^$/d' filename | awk '!a[$1]++' 

Combinação de grep e awk :

grep . filename | awk '!a[$1]++'

Como @ cas sugerido, você também pode fazer isso em um único comando awk .

awk '!x[$1]++ && ! /^[[:blank:]]*$/' filename
    
por 06.05.2016 / 11:46
1

Você pode usar awk '!x[$1]++' file > file_new

Enquanto tentava este comando, eu estava recebendo uma nova linha extra no arquivo que você deu.

Eu modifiquei isso para awk '!x[$1]++' file | sed '/^$/d' > file_new , o que deve resolver seu problema para este caso.

    
por 06.05.2016 / 11:50
0

Eu costumo usar sort e uniq juntos para me livrar de duplicatas como esta:

    cat file | sort | uniq

No entanto, com sua entrada, terminará assim:

    -------
    1234
    2344
    87676
    9555
    TABLE1

Este comando remove todos os números, exceto os que são adicionados, e adiciona o cabeçalho depois:

    cat file | grep '^[[:digit:]]*$'| grep -v '^$' |sed '1iTABLE1\n-------'

e fornece este resultado:

    TABLE1
    -------
    1234
    9555
    87676
    2344
    
por 06.05.2016 / 11:35
0

Use o comando uniq , você pode remover entradas duplicadas. Como:

cat file | sort -r | uniq

Mas, neste caso específico, não está produzindo exatamente o resultado esperado, pois o arquivo deve ser classificado para que uniq funcione - ele só detectará linhas duplicadas se elas forem adjacentes.
Outra solução seria ler o arquivo e pular as linhas contendo TABLE ou ---- (exceto a primeira ocorrência):

count_t=0
count_d=0
while read line; do 
  if [[ $line == "TABLE"* ]] ; then  
    if [[ $count_t -eq 0 ]]; then 
      ((count_t++)) 
    else
      continue 
    fi 
  fi
  if [[ $line == "-----"* ]] ; then  
    if [[ $count_d -eq 0 ]]; then 
      ((count_d++)) 
    else
      continue 
    fi
  fi
  echo $line
done < file

As soluções awk e sed publicadas por outras pessoas são melhores.

    
por 06.05.2016 / 11:18
0

Apesar de ser um tópico antigo, gostaria de contribuir com essa resposta que usa apenas um único comando sed:

sed '1,2p;/^[[:digit:]]/!d;' file

Ele mantém as duas primeiras linhas (o título e o sublinhado) e, em seguida, exclui todas as linhas que não começam com um dígito.

    
por 14.12.2018 / 15:15