【问题标题】:Bash - Getting count of a word group by every second [closed]Bash - 每秒获取一个单词组的计数[关闭]
【发布时间】:2019-02-11 10:12:51
【问题描述】:

这是文本文件的示例。我需要从 pipleline("|") 之前的字符串中每隔几秒按单词“Id”组计数

2019-02-10 12:00:03.448|Id: 26102338
2019-02-10 12:00:03.448|Id: 25941418
2019-02-10 12:00:03.449|Id: 25827373
2019-02-10 12:00:03.449|Id: 26102038
2019-02-10 12:00:03.449|Id: 25929358

2019-02-10 12:00:04.382 | =====================================Start 
fetching=====================================
2019-02-10 12:00:04.451 |
2019-02-10 12:00:04.426|Id: 25713118
2019-02-10 12:00:04.426|Id: 26076208
2019-02-10 12:00:04.426|Id: 26079643
2019-02-10 12:00:04.426|Id: 26085973
2019-02-10 12:00:04.426|Id: 26090023
2019-02-10 12:00:04.426|Id: 26130133
2019-02-10 12:00:04.426|Id: 25954018
2019-02-10 12:00:04.427|Id: 25951468
2019-02-10 12:00:04.427|Id: 26136148
2019-02-10 12:00:04.427|Id: 26103013
2019-02-10 12:00:04.427|Id: 25806433

我需要这样输出:

Time               |Count(Id)  
2019-02-10 12:00:03|5    
2019-02-10 12:00:04|11

谁能帮忙?

【问题讨论】:

    标签: bash shell group-by count centos7


    【解决方案1】:

    如果每一行的末尾总是有一个Id,并且您不介意格式相反,这很简单:

    grep 'Id:' /tmp/data.txt | cut -f 1 -d '.' | uniq -c
    
       5 2019-02-10 12:00:03   
      11 2019-02-10 12:00:04
    
    1. grep 丢弃空行。

    2. cut 选择点之前的字段(即没有毫秒的时间)。

    3. uniq统计每次出现的总数。

    (如果文件不总是按顺序排列,您可能还需要在uniq 之前的sort)。

    要反转数据并添加管道以匹配您请求的格式,您可以通过 sed 管道输出 - 类似于:

    sed -re 's/ +([0-9]+) (.+)/\2|\1/'
    

    【讨论】:

    • 澄清:这将计算 lfile 中每个时间戳的行数(精确到秒)。虽然在查看输入数据时这是有道理的,但这不是 OP 所要求的,因为(例如)字符串 Id: 是否适用于该行无关紧要。老实说,我不是很了解这里 OP 的要求,所以我无法提供更好的解决方案....
    • 我已经更新了我的问题。该文件将包含此类数据。您能否根据我的问题更新您的答案。
    • 我已将grep 更改为只选择其中包含Id: 的行。
    • 非常感谢。它正在工作@match
    • 如果我以后想要计数以及这些值之间的管道怎么办。喜欢2019-02-10 12:00:03|6
    【解决方案2】:

    数据.txt

    2019-02-10 12:00:03.448|Id: 26102338
    2019-02-10 12:00:03.448|Id: 25941418
    2019-02-10 12:00:03.449|Id: 25827373
    2019-02-10 12:00:03.449|Id: 26102038
    2019-02-10 12:00:03.449|Id: 25929358
    
    2019-02-10 12:00:04.426|Id: 25713118
    2019-02-10 12:00:04.426|Id: 26076208
    2019-02-10 12:00:04.426|Id: 26079643
    2019-02-10 12:00:04.426|Id: 26085973
    2019-02-10 12:00:04.426|Id: 26090023
    2019-02-10 12:00:04.426|Id: 26130133
    2019-02-10 12:00:04.426|Id: 25954018
    2019-02-10 12:00:04.427|Id: 25951468
    2019-02-10 12:00:04.427|Id: 26136148
    2019-02-10 12:00:04.427|Id: 26103013
    2019-02-10 12:00:04.427|Id: 25806433
    
    2019-02-10 12:00:03.427|Id: 25806433
    

    命令:

    grep 'Id:' data.txt | cut -f 1 -d '.' | sort | uniq -c | awk '{print $2" "$3" | "$1}'
    

    在计数之前排序以避免无序的时间戳

    输出:

    2019-02-10 12:00:03 | 6
    2019-02-10 12:00:04 | 11
    

    【讨论】:

    • 我可以稍后显示计数以及这些值之间的管道,例如我想要的确切输出吗?
    • 是的,你可以。检查答案。我更新了它。
    • 如果您仍然使用 Awk,那么您也希望在 Awk 中完成所有其余的处理。
    • 这是为什么呢?...您是否更节省了 CPU 功率..我不这么认为? @tripleee
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多