我有类似下面的长数据
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
答案 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