Este não é um comportamento aleatório. De man uniq
:
Nota: 'uniq' não detecta linhas repetidas, a menos que sejam adjacentes. Você pode querer classificar a entrada primeiro ou usar 'sort -u' sem 'uniq'. Além disso, comparações honram as regras especificadas por 'LC_COLLATE'.
Essencialmente, uniq
, por padrão, só funciona na entrada classificado . É assim, por design, em outras palavras.
Sua principal pergunta, no entanto, é:
como o número da linha de aparência de uma linha afeta a contagem das ocorrências no arquivo
Para responder a essa pergunta, você realmente precisa ver o código-fonte:
while (!feof (stdin))
{
char *thisfield;
size_t thislen;
if (readlinebuffer_delim (thisline, stdin, delimiter) == 0)
break;
thisfield = find_field (thisline);
thislen = thisline->length - 1 - (thisfield - thisline->buffer);
if (prevline->length == 0
|| different (thisfield, prevfield, thislen, prevlen))
{
fwrite (thisline->buffer, sizeof (char),
thisline->length, stdout);
SWAP_LINES (prevline, thisline);
prevfield = thisfield;
prevlen = thislen;
}
}
A chave aqui é que o arquivo é lido linha por linha e a comparação pode ser feita apenas com a linha atual e a anterior na função different()
, que retorna True se as linhas não forem as mesmas, Falso se eles são os mesmos. A razão para isso é que, se você fosse comparar com todas linhas, provavelmente precisaria de grande quantidade de memória se houvesse um grande número de linhas. Isso não é prático e diminuiria a velocidade de uniq
consideravelmente