我如何使用grep/awk或任何脚本方法来聚合时间输入行(例如,按秒)



如何使用grep/awk或任何脚本方法来聚合时间输入行(例如秒)例如:

我有输入:

13:27:53.336281
13:27:53.336284
13:27:53.346284
13:27:54.336435
13:27:54.336468

如果我需要输出

13:27:53 3
13:27:54 2
cut -f 1 -d . input.txt | sort | uniq -c

我不认为你可以使用grep做你想做的事,但awk是有能力的:

awk -F. 'NR > 1 && $1 != prev { print prev, count; count = 0 } 
         { prev = $1; ++count } 
         END { print prev, count }' file

每当prev与第一个字段$1的当前值不匹配时,就会打印输出。由于尚未设置prev,因此跳过第一条记录。中间块应用于所有记录并递增计数。END块确保打印最后一次的结果。

另一种选择是使用关联数组,但如果这样做,结果将不排序。此外,如果您的文件很大,那么内存消耗可能是一个问题(此方法只存储prevcount,因此内存使用量与文件大小无关)。

由于问题具有awk标记,因此这里有一个awk解决方案。

$ cat input.txt 
13:27:53.336281
13:27:53.336284
13:27:53.346284
13:27:54.336435
13:27:54.336468
$ awk -F'.' '{ aa[$1]++ } END{ for (key in aa) print key " " aa[key]}' input.txt 
13:27:53 3
13:27:54 2

更新:如注释所示,不保证输出的顺序。因此,可能有必要将awk的输出管道传输到sort

最新更新