Verifique se todas as linhas de um arquivo são exclusivas

10

Eu tenho um arquivo de texto contendo linhas como esta:

This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
.
.
.
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520

Como posso ter certeza da exclusividade de cada linha?

NOTA: O objetivo é testar o arquivo, e não modificá-lo se houver linhas duplicadas.

NOTA 2: Submissão das informações do moderador, a edição está bem.

    
por snr 06.07.2018 / 18:29

8 respostas

24
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique
    
por 06.07.2018 / 18:36
24

Solução Awk:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"
    
por 06.07.2018 / 18:58
20

Usando sort / uniq :

sort input.txt | uniq

Para verificar apenas linhas duplicadas, use a opção -d para uniq. Isso mostrará apenas as linhas duplicadas, se nenhuma mostrar nada:

sort input.txt | uniq -d
    
por 06.07.2018 / 18:32
5

TLDR

A pergunta original não ficou clara, e leu que o OP simplesmente queria uma versão única do conteúdo de um arquivo. Isso é mostrado abaixo. Na forma atualizada da questão, o OP agora está afirmando que ele / ela simplesmente quer saber se o conteúdo do arquivo é único ou não.

Teste se o conteúdo do arquivo é único ou não

Você pode simplesmente usar sort para verificar se um arquivo é único ou se contém duplicatas da seguinte forma:

$ sort -uC input.txt && echo "unique" || echo "duplicates"

Exemplo

Digamos que eu tenha esses dois arquivos:

arquivo de amostra duplicado
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
arquivo de amostra exclusivo
$  cat uniq_input.txt
A
B
C
D

Agora, quando analisamos esses arquivos, podemos dizer se eles são exclusivos ou se contêm duplicatas:

teste o arquivo duplicado
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
teste arquivo exclusivo
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique

Pergunta original (conteúdos sem igual do arquivo)

Pode ser feito com apenas sort :

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680
    
por 06.07.2018 / 18:37
3

Geralmente, eu uso sort do arquivo e, em seguida, uso uniq para contar o número de duplicatas e, em seguida, eu sort , mais uma vez, vê as duplicatas na parte inferior da lista.

Eu adicionei uma duplicata aos exemplos que você forneceu:

$ sort thread.file | uniq -c | sort
      1 This is a thread  139737186379520
      1 This is a thread  139737194772224
      1 This is a thread  139737203164928
      1 This is a thread  139737312270080
      1 This is a thread  139737513694976
      1 This is a thread  139737522087680
      2 This is a thread  139737505302272

Desde que eu não li a man page de uniq em algum momento, dei uma olhada rápida em qualquer alternativa. O seguinte elimina a necessidade da segunda classificação, se você quiser apenas ver duplicatas:

$ sort thread.file | uniq -d
This is a thread  139737505302272
    
por 06.07.2018 / 18:49
2

Se não houver duplicatas, todas as linhas são exclusivas:

[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"

Descrição: Ordenar as linhas de arquivo para fazer linhas repetidas consecutivas (classificar)
Extrai todas as linhas consecutivas que são iguais (uniq -d).
Se houver alguma saída do comando acima ( [...] ), então ( && ) imprime uma mensagem.

    
por 06.07.2018 / 21:35
2

Isso não estaria completo sem uma resposta Perl!

$ perl -ne 'print if ++$a{$_} == 2' yourfile

Isso imprimirá cada linha não exclusiva uma vez: se ela não imprimir nada, o arquivo terá todas as linhas exclusivas.

    
por 08.07.2018 / 03:48
1

Usando cmp e sort em bash :

cmp -s <( sort file ) <( sort -u file ) && echo 'All lines are unique'

ou

if cmp -s <( sort file ) <( sort -u file )
then
    echo 'All lines are unique'
else
    echo 'At least one line is duplicated'
fi

Isso classificaria o arquivo duas vezes, assim como a resposta aceita.

    
por 06.07.2018 / 21:45