awk统计文本里某一列重复出现的次数

时间:2023-03-08 16:53:12
awk统计文本里某一列重复出现的次数

比如这样的场景:现在有一个文本,里面是这样的内容:

NOTICE: 12-14 15:11:13:  parser. * 6685  url=[http://club.pchome.net/thread_1_18_7283270___TRUE.html] get_tm=115 PAGE=15471[Z]:59066 css_tm=1043 css_res=0/4[0] CONT=3230[Z]:4797 LINK=6095[Z]:22834 TITL=61 PtDef=7 UnifyUrl=47 PvDetail=444 data_path_tm=254 antispam_tm=1811816124 spaminfo=825 [spam_punish_type:0] spam_serv_tm=[393725], spam_except[ANTI_SUCCESS] ext_tm=183608721 ext_sv=[10.226.42.53:33018] ext_ret=4 dump_tm=226  <StContinuesBuild:don't have FeedData, all strategies must run> db_type=se lua_ku_type=se get IndexFeature is :1270 total_tm=816832421

很明显的这个文本里面的第三列是个时间戳,我想要知道同一个时间内处理了多少条记录,那么使用awk,这样即可。

cat logfile | awk '{a[$3]++}END{for(i in a){print i,a[i] | "sort -k 1"}}' 

在这条命令中,将文本的第三列作为key,同样的key不停累加,最后输出累加的数组值。最后sort -k1是将结果按照第一列来排序,就是时间戳的小时来排序。

cat logfile |awk '{a[$1]++}END{for(i in a){print i,a[i]}}'|awk '{if($2 > 1 ){print i,$0}}'

还有一种更为简便的方法,使用linux的uniq -c命令来统计,不用写awk命令:

cat logfile | awk '{print $3}' | uniq -c

说实话,这个命令不好用,不准确。