使用正则表达式打印元素在文件中出现的次数

printing the number of times a element occurs in a file using regex

我有一个类似于下面的长数据

    16:24:59        0       0       0
    16:24:59        0       1       0
    16:25:00        0       1       0
    16:25:00        0       1       0
    16:25:00        0       2       0
    16:25:00        0       2       0
    16:25:00        1       0       1
    16:25:01        0       0       0
    16:25:01        0       0       0
    16:25:01        0       0       0
    16:25:01        0       0       0
    16:25:01        4       9       4
    16:25:02        0       0       0
    16:25:02        0       0       0
    16:25:02        0       0       0
    16:25:02        0       1       0
    16:25:02        1       9       1
    16:25:02        2       0       2

我希望输出第 1 列中的元素及其出现的次数。以下是我的期望。我该怎么做?

    16:24:59        2
    16:25:00        5
    16:25:01        5
    16:25:02        6

如何将上面的替换为

    t1        2
    t2        5
    t3        5
    t4        6
     .
     .
    tn        9 

使用 awk

非常简单
awk '{count[]++} END{ for ( i in count) print i, count[i]}'

测试

$ awk '{count[]++} END{ for ( i in count) print i, count[i]}' input
16:24:59 2
16:25:00 5
16:25:01 5
16:25:02 6

它有什么作用?

  • count[]++ 创建一个由第一个字段索引的关联数组。

  • END 在输入文件末尾执行的操作。

  • for ( i in count) print i, count[i] 遍历数组 count 并打印值

以防万一您需要 grep 和 uniq 解决方案:

$ grep -Eo '^\s*\d\d:\d\d:\d\d' /tmp/lines.txt | uniq -c
   2     16:24:59
   5     16:25:00
   5     16:25:01
   6     16:25:02

或者,如果制表符分隔,请使用 cut:

$ cut -f 2 /tmp/lines.txt | uniq -c
   2 16:24:59
   5 16:25:00
   5 16:25:01
   6 16:25:02