Como suspeito por David Dai e cas as duas linhas são de fato diferentes, mas a única diferença é em caracteres invisíveis.
Seu arquivo é um arquivo de texto do Windows. Nos arquivos de texto do Windows, as linhas são separadas pela seqüência de dois caracteres CR, LF (retorno de carro, alimentação de linha). Em um arquivo de texto Unix, as linhas são finalizadas por um caractere LF (feed de linha, também conhecido como nova linha). cat -A
mostra um CR como ^M
e um feed de linha como $
seguido por uma quebra de linha.
Quando um arquivo de texto do Windows é processado por um utilitário Unix, o utilitário Unix vê um caractere CR extra no final de cada linha. No que diz respeito aos utilitários Unix, o CR é apenas um caractere comum; uma linha com um CR no final é diferente de uma linha idêntica, exceto pela falta de um CR no final. Além disso, no Windows, a seqüência de nova linha é um separador, portanto, não há CR, LF no final do arquivo. Mas no Unix, um arquivo de texto sempre termina com um caractere LF, a menos que esteja vazio. Então, quando você processa um arquivo de texto do Windows com um utilitário Unix, o que o utilitário Unix vê é um arquivo com CR no final de cada linha (porque os caracteres CR não fazem parte da codificação Unix de uma nova linha) e algum texto à direita isso não faz parte de uma linha (por causa da falta de uma nova linha no final).
Utilitários de texto Unix diferem no que eles fazem quando sua entrada não é um arquivo de texto válido devido à falta de uma nova linha final. Os utilitários GNU - que é o que você encontrará no Linux não integrado e no Cygwin - se esforçam para tratar esses arquivos como arquivos de texto e preservam a falta de uma nova linha final. O comando sort
embaralha as linhas e, embora processe uma linha de entrada inacabada, sempre emite uma nova linha no final da saída. Assim, para o comando sort
, o que você tem parece um monte de linhas, cada uma delas termina com o caractere CR, exceto a última linha de entrada que não termina com CR. Na saída, todas as linhas terminam com CR, exceto aquela linha que corresponde à última linha de entrada.
uniq
vê um monte de linhas que terminam com brave!
e um CR e retém apenas uma delas. Ele também vê uma linha que termina com brave!
, mas sem CR, que ela emite obedientemente, pois essa linha difere de todas as outras linhas.
Quando você imprime a saída no terminal, um caractere CR instrui o terminal a mover o cursor para o início da linha atual; um caractere LF instrui o terminal a mover o cursor para o início da próxima linha. Assim, as sequências LF e CR, LF não são visualmente distinguíveis, e você vê duas linhas idênticas. O comando cat -A
adiciona caracteres imprimíveis para torná-los distintos.