为什么命令 uniq -c 在开头放置一个空格?

为什么命令 uniq -c 在开头放置一个空格?

我在 shell 脚本中有这样的代码:

sort input | uniq -c | sort -nr > output

输入文件前面没有空格,但输出有。我该如何修复?这是在 bash 中

答案1

默认行为独特是将频率右对齐在一行中 7 个空格宽,然后用一个空格将频率与项目分开。

来源 :https://www.thelinuxrain.com/articles/tweaking-uniq-c(时光倒流机器)

使用 sed 删除前导空格:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output

答案2

uniq -c添加前导空格。例如

$ echo test
test
$ echo test | uniq -c
      1 test

您可以在管道末尾添加命令来将其删除。例如

$ echo test | uniq -c | sed 's/^\s*//'
1 test

答案3

您可以使用不同的排序工具来获得更大的灵活性。Python 就是这样一种工具。

来源

#!/usr/bin/python3
import sys, operator, collections

counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
    print(count, item)

理论上,这甚至比sort用于大量输入的工具更快,因为上述程序使用哈希表而不是排序列表来识别重复行。(遗憾的是,它将相同计数的行按任意顺序而不是自然顺序排列;这可以修改,并且仍然比两次sort调用更快。)

输出格式

如果你希望输出格式更灵活,你可以研究一下print()format()内置函数。

例如,如果要以八进制形式打印最多 7 个前导零的计数数字,后跟制表符(而不是带有 NUL 行终止符的空格符),请将最后一行替换为:

    print(format(count, '08o'), item, sep='\t', end='\0')

用法

将脚本存储在一个文件中,例如sort_count.py,然后用 Python 调用它:

python3 sort_count.py < input

答案4

uniq -c -i | tr -s ' ' | cut -c 2-

使用 tr -s 将前导空格转换为单个空格,然后使用 cut -c 从第二个字符开始打印输出。

相关内容