我正在创建一个 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)
知道我做错了什么吗?
在过滤文件之前,您没有对文件进行排序。从联机帮助页:
注意:
uniq除非它们相邻,否则不会检测重复的行。您可能想先对输入进行排序,或者sort -u不使用uniq. 此外,比较遵循由 指定的规则LC_COLLATE。
您还需要一次性处理所有要计算的行。目前,您一次只处理一种文件类型,因此uniq -c正确地告诉您每种类型都有一种——它一次只能看到一种文件类型。
file * | sort | uniq -c
Run Code Online (Sandbox Code Playgroud)
会更合适(大概有更具体的 glob,甚至是要处理的文件列表)。