Aqui estão os comandos em um arquivo aleatório do pastebin :
wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258
As páginas de manual não são claras sobre o que a -u
bandeira está fazendo. Algum conselho?
Respostas:
Versão curta:
uniq
, sem-u
, torna cada linha da saída única.uniq -u
apenas imprime todas as linhas exclusivas da entrada .Versão ligeiramente mais longa:
uniq
é para lidar com arquivos que tenham linhas duplicadas e somente quando essas linhas aparecerem sucessivamente na entrada. Portanto, para seus propósitos, uma linha exclusiva é aquela que não é duplicada imediatamente.(
uniq
possui uma memória de curto prazo muito limitada; nunca se lembrará se uma linha apareceu anteriormente na entrada, a menos que fosse a linha imediatamente anterior - é por isso queuniq
muitas vezes é emparelhadasort
.)Quando encontra uma sequência de linhas duplicadas
uniq
, sem o-u
argumento, imprime uma cópia dessa linha. (Torna cada linha da saída única ).Com o
-u
argumento, ele imprime zero cópias dessa linha - execuções de duplicatas são apenas omitidas na saída.fonte
sort -u
vez desort | uniq
.uniq
faz normalização e agrupamento, sim. Mas, mesmo assim, é apenas uma consideração local - você sabe onde na linha classificada a linha aparecerá e só precisa selecionar qual das várias linhas adjacentes manter. Se a entrada não for classificada, a decisão afetará toda a operação de uniqificação, por exemplo, se você manterá a última duplicata, não poderá produzir nada até ler a última linha da entrada ...uniq
com-u
saltos quaisquer linhas que têm duplicados. Portanto:Normalmente,
uniq
imprime linhas no máximo uma vez (assumindo entrada classificada). Esta opção realmente imprime linhas verdadeiramente únicas (não tendo aparecido novamente).fonte
uniq
poderia ser chamadodistinct
, pois imprime todas as linhas distintas, enquantouniq -u
imprime todas as linhas exclusivas.uniq
em algumas localidades.A especificação uniq POSIX descreveu claramente:
-u
opção façauniq
para não imprimir linhas repetidas.A maioria das
uniq
implementações usava comparação de bytes, enquanto o GNUuniq
usava ordem de agrupamento para filtrar linhas duplicadas. Portanto, ele pode produzir resultados errados em algumas localidades, por exemplo, naen_US.UTF-8
localidade:e não
-u
deu linhas:Portanto, você deve definir o código do idioma
C
para obter uma comparação de bytes:fonte
uniq
(embora aparentemente a intenção do POSIX seja que ele faça comparação de bytes em vez de comparação de strcoll () como emsort -u
)) como os locais que erroneamente têm a mesma classificação de ②. Pelo menos o GNUuniq
é consistente comsort -u
.uniq
a necessidade de executar o memcmp / strcmp em oposição ao strcoll, isso não é muito aparente para mim, mas sim para Geoff . Sobre as localidades do GNU terem 'a mesma classificação que', isso é claramente um erro, pois não há razão para que eles devam classificar da mesma forma. Isso é permitido pelo POSIX, mas há algumas mudanças por vir .normal:
uniq: não há duas linhas de repetição subsequentes
ordenado
sort -u: não há duas linhas repetidas
sort / uniq: todos distintos
conta ocorrências distintas
somente linhas que não são repetidas (não classificadas primeiro)
apenas linhas que não são repetidas (após a classificação)
uniq -d: imprime apenas linhas duplicadas, uma para cada grupo
.. contado
fonte