使用“uniq -c”命令时,需要从输出中删除计数

时间:2012-04-10 06:27:13

标签: linux bash shell unix

我正在尝试读取文件并按特定字段的出现次数对其进行排序。假设我想从日志文件中找出最重复的日期,然后我使用uniq -c选项并按降序排序。像这样的东西

uniq -c | sort -nr 

这会产生一些像这样的输出 -

809 23/Dec/2008:19:20

第一个实际上是计数的字段对我来说是个问题....我想从上面的输出中得到日期,但是我无法得到它。我尝试使用cut命令并执行此操作

uniq -c | sort -nr | cut -d' ' -f2 

但是这只是打印空白区域...请有人帮助我获取日期并切断计数。我只想要

23/Dec/2008:19:20

由于

5 个答案:

答案 0 :(得分:8)

来自uniq的计数前面有空格,除非计数中的数字超过7位,因此您需要执行以下操作:

uniq -c | sort -nr | cut -c 9-

获取列(字符位置)9向上。或者您可以使用sed

uniq -c | sort -nr | sed 's/^.\{8\}//'

或:

uniq -c | sort -nr | sed 's/^ *[0-9]* //'

面对10,000,000或更多的重复计数,第二种选择是强劲的;如果你认为这可能是一个问题,它可能比cut替代方案更好。毫无疑问,还有其他选择。


警告:计数是通过Mac OS X 10.7.3上的实验确定的,但使用来自uniq 8.3的GNU coreutils。 BSD uniq -c在单个数字计数之前产生了3个前导空格。 POSIX规范说明uniq -c的输出格式应如下:

printf("%d %s", repeat_count, line);

不会有任何领先的空白。鉴于输出格式可能存在差异,sed脚本与[0-9]正则表达式是处理uniq -c的观察和理论输出变化的最可靠方法:

uniq -c | sort -nr | sed 's/^ *[0-9]* //'

答案 1 :(得分:4)

而不是cut -d' ' -f2,请尝试

awk '{$1="";print}'

也许你需要在开头删除一个空白:

awk '{$1="";print}' | sed 's/^.//'

或完全使用sed,保留原始whitspace:

sed -r 's/^[^0-9]*[0-9]+//'

答案 2 :(得分:2)

另一种解决方案是:

uniq -c | sort -nr | awk '{print $1, $2}'

您也可以轻松打印单个字段。

答案 3 :(得分:1)

如果您想使用下游的count字段,则以下命令会将其重新格式化为管道友好的'没有左边填充的制表符分隔格式:

 .. | sort | uniq -c | sed -r 's/^ +([0-9]+) /\1\t/'

对于原始任务来说,这有点过分,但重新格式化后,可以使用cut删除字段,如OP所预期的那样:

 .. | sort | uniq -c | sed -r 's/^ +([0-9]+) /\1\t/' | cut -d $'\t' -f2-

答案 4 :(得分:1)

tr -s添加到管道链中,以便"挤压"多个空格分隔成一个空格分隔符:

uniq -c | tr -s ' ' | cut -d ' ' -f3

tr在一些不起眼的地方非常有用。不幸的是,它并没有摆脱第一个领先空间,因此-f3