[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique
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.
Solução Awk:
awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"
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
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.
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"
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
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
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
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.
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.
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.
Tags text-processing