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

时间:2015-01-28 18:12:01

标签: regex awk

我有类似下面的长数据

    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 

2 个答案:

答案 0 :(得分:2)

使用awk

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

<强>测试

$ awk '{count[$1]++} 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[$1]++创建一个由第一个字段索引的关联数组。

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

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

答案 1 :(得分:2)

以防您需要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