【问题标题】:count lines by hour按小时计算行数
【发布时间】:2012-11-14 22:05:51
【问题描述】:

按小时或按分钟计算我们看到某行的次数的命令是什么?

文件:

Nov 26 08:50:51
Nov 26 08:50:51
Nov 26 08:51:09
Nov 26 08:51:09
Nov 26 08:51:09
Nov 26 08:51:09
Nov 26 08:51:40

我想看到的输出:

按分钟:

Nov 26 08:50    2
Nov 26 08:51    5

按小时:

Nov 26 08       7

【问题讨论】:

  • 谢谢大家的回答 :) 帮了大忙。
  • 如果日期改变了怎么办?您是在寻找全天 08:50 的输出,还是每天 08:50 的输出?

标签: linux unix awk


【解决方案1】:

这可以通过uniq来完成:

$ uniq -w9 -c file       # by hour
      7 Nov 26 08:50:51
$ uniq -w12 -c file      # by minute
      2 Nov 26 08:50:51
      5 Nov 26 08:51:09

-w 只比较第一个 n 字符。

-c 前缀行的出现次数。

【讨论】:

  • "但是如果写的天
  • 这很好,但我必须指出,此解决方案仅适用于 Linux。 *BSD(包括 OSX)中的 uniq 不包括 -w 选项。
  • @ghoti 更准确地说,这个解决方案需要 GNU 的 uniq 实现,它可以安装在任何操作系统上。
  • 确实如此。如果您在 FreeBSD 中安装 coreutils,您想要的命令实际上称为 guniq。我添加这个只是为了后代。答案还是很棒的。 :-)
  • 也适用于 Solaris。假设这是按日期/时间对文件进行计数,这里是一个从 ls 开始的示例。这个特殊的例子按 10 小时计算。 ls -l /foo/bar* | nawk '{打印 $6 " " $7 " " $8}' | uniq -w7 -c
【解决方案2】:

awk one-liner 让您一次性按小时和分钟计算:

awk -F: '{h[$1]++;m[$1":"$2]++;}END{for(x in h)print x,h[x]; print "---"; for(x in m)print x,m[x]}' file

测试

kent$  echo "Nov 26 08:50:51
Nov 26 08:50:51
Nov 26 08:51:09
Nov 26 08:51:09
Nov 26 08:51:09
Nov 26 08:51:09
Nov 26 08:51:40"|awk -F: '{h[$1]++;m[$1":"$2]++;}END{for(x in h)print x,h[x]; print "---"; for(x in m)print x,m[x]}'    

输出

Nov 26 08 7
---
Nov 26 08:50 2
Nov 26 08:51 5

【讨论】:

  • 谢谢你,正是我需要的。做一个管道和排序'| sort' 也可以按正确的顺序排列所有内容。
【解决方案3】:

按小时:

awk '{split($3,a,":");b[$1" "$2" "a[1]]++}END{for(i in b)print i,b[i]}' your_file

在下面测试:

> awk '{split($3,a,":");b[$1" "$2" "a[1]":"a[2]]++}END{for(i in b)print i,b[i]}' temp
Nov 26 08:50 2
Nov 26 08:51 5
>

按分钟:

awk '{split($3,a,":");b[$1" "$2" "a[1]":"a[2]]++}END{for(i in b)print i,b[i]}' your_file

测试如下:

> awk '{split($3,a,":");b[$1" "$2" "a[1]]++}END{for(i in b)print i,b[i]}' temp
Nov 26 08 7

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多