为什么 uniq 实用程序会给我意想不到的结果?

Sam*_*lla 0 sort uniq

我正在创建一个 shellscript,它将打印出我们目录中的各种文件类型。它几乎可以工作,但是,由于某些奇怪的原因,当我尝试在我的输出中使用 uniq 时,它不起作用。这是我的输入(和 的值$FILE_TYPE

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
Run Code Online (Sandbox Code Playgroud)

但是当我使用

FILE_TYPE_COUNT=`echo "$FILE_TYPE" | sort | uniq -c`
Run Code Online (Sandbox Code Playgroud)

这是它打印的结果

  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
Run Code Online (Sandbox Code Playgroud)

显然应该是

  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
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

Ste*_*itt 5

在过滤文件之前,您没有对文件进行排序。从联机帮助页

注意:uniq除非它们相邻,否则不会检测重复的行。您可能想先对输入进行排序,或者sort -u不使用uniq. 此外,比较遵循由 指定的规则LC_COLLATE

您还需要一次性处理所有要计算的行。目前,您一次只处理一种文件类型,因此uniq -c正确地告诉您每种类型都有一种——它一次只能看到一种文件类型。

file * | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)

会更合适(大概有更具体的 glob,甚至是要处理的文件列表)。

  • @Rawrplus 您需要将整个输出传递给对 `sort` 的调用,而不是将每一行单独传递给对 `sort` 的单独调用。如果您不明白如何做到这一点,请使用您的实际代码(完整脚本,而不仅仅是一行)提出一个新问题。 (2认同)