我正在尝试读取一个文件,并按特定字段的出现次数对其进行sorting。 假设我想从日志文件中找出最重复的date,然后使用uniq -c选项并按降序对其进行sorting。 像这样的东西
uniq -c | sort -nr
这会产生这样的输出 –
809 23/Dec/2008:19:20
实际上计数的第一个字段是我的问题….我想从上面的输出得到ony的date,但米无法得到这个。 我试图使用切割命令,并做到了这一点
uniq -c | sort -nr | cut -d' ' -f2
但这只是打印空白…请有人可以帮助我获得date,并砍掉计数。 我只想要
Shell脚本 – SFTP – >如果复制,删除?
我将如何实现searchfunction来查找文件或目录
壳shell内的shell脚本
23/Dec/2008:19:20
谢谢
bash:无法执行二进制文件:即使二进制文件和Linux是64位,也会执行格式错误
为什么我的Python脚本不能写入文件?
在terminal/ Linux上查找包含特定date范围文件名的所有文件
如何在文本文件中包含带有模式的string的行末尾添加文本?
除非计数超过7位数,否则来自uniq的计数前面是空格,所以您需要执行如下操作:
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上的实验确定的,但是使用来自coreutils 8.3的GNU uniq 。 BSD uniq -c在一个数字之前产生了3个前导空格。 POSIX规范说, uniq -c的输出应该被格式化为:
printf("%d %s",repeat_count,line);
这将不会有任何领先的空白。 考虑到输出格式的这种可能的差异,具有[0-9]正则表达式的sed脚本是处理来自uniq -c观察和理论输出变化的最可靠方法:
uniq -c | sort -nr | sed 's/^ *[0-9]* //'
不要cut -d' ' -f2 ,请尝试
awk '{$1="";print}'
awk '{$1="";print}' | sed 's/^.//'
或用sed完成,保留原来的空白区域:
sed -r 's/^[^0-9]*[0-9]+//'
另一种解决方案是这样的:
uniq -c | sort -nr | awk '{print $1,$2}'
也可以轻松打印单个字段。
如果你想使用下游的计数字段,下面的命令将把它重新格式化为一个'管道友好'制表符分隔的格式,而不需要填充左边的内容:
.. | sort | uniq -c | sed -r 's/^ +([0-9]+) /1t/'
对于原始任务来说,这是一个矫枉过正的问题,但在重新格式化之后,可以使用cut来删除该字段,正如OP所期望的那样:
.. | sort | uniq -c | sed -r 's/^ +([0-9]+) /1t/' | cut -d $'t' -f2-
将tr -s添加到管道链中以将多个空间“挤”到一个空格分隔符中:
uniq -c | tr -s ' ' | cut -d ' ' -f3
tr在一些不起眼的地方非常有用。 不幸的是,它并没有摆脱第一个领先的空间,因此-f3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。