Por que o utilitário uniq me fornece resultados inesperados?

1

Então, há uma salsicha que eu absolutamente não posso envolver minha cabeça.

Basicamente estou criando um shellscript que irá imprimir vários tipos de arquivos que temos em nosso diretório. Isso funciona, no entanto, por algum motivo estranho, quando tento usar o uniq na minha saída, não funciona. Esta é minha saída

POSIX shell script, ASCII text executable
ASCII text
Bourne-Again shell script, ASCII text executable
UTF-8 Unicode text, with overstriking
Bourne-Again shell script, ASCII text executable

Parece bastante auto-explicativo, no entanto, quando eu uso

FILE_TYPE_COUNT='echo "$FILE_TYPE" | sort | uniq -c'

este é o resultado que imprime

  1 POSIX shell script, ASCII text executable
  1 ASCII text
  1 Bourne-Again shell script, ASCII text executable
  1 UTF-8 Unicode text, with overstriking
  1 Bourne-Again shell script, ASCII text executable

Obviamente, deve ser

  1 POSIX shell script, ASCII text executable
  1 ASCII text
  2 Bourne-Again shell script, ASCII text executable
  1 UTF-8 Unicode text, with overstriking

Alguma ideia do que estou fazendo errado?

    
por Rawrplus 19.03.2017 / 19:38

1 resposta

5

Você não está classificando o arquivo antes de filtrá-lo. Na página de manual :

Note: uniq does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use sort -u without uniq. Also, comparisons honor the rules specified by LC_COLLATE.

Você também precisa processar todas as linhas que deseja contar de uma só vez. Atualmente, você está processando tipos de arquivo um de cada vez, então uniq -c diz corretamente que você tem um de cada - ele só vê um tipo de arquivo de cada vez.

file * | sort | uniq -c

seria mais apropriado (presumivelmente com um glob mais específico, ou até mesmo uma lista de arquivos para processar).

    
por 19.03.2017 / 19:48

Tags