我在 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 从第二个字符开始打印输出。