Bash 计算文件中令牌的出现次数

Bash 计算文件中令牌的出现次数,bash,shell,grep,Bash,Shell,Grep,我有一个服务器访问日志,带有每个http请求的时间戳,我想获得每秒请求数的计数。使用sed和cut-c,到目前为止,我已成功地将文件缩减到仅包含时间戳,例如: 2008年9月22日20:00:21+0000 2008年9月22日20:00:22+0000 2008年9月22日20:00:22+0000 2008年9月22日20:00:22+0000 2008年9月22日20:00:24+0000 2008年9月22日20:00:24+0000 我想得到的是每个唯一时间戳在文件中出现的次数。例如,

我有一个服务器访问日志,带有每个http请求的时间戳,我想获得每秒请求数的计数。使用
sed
cut-c
,到目前为止,我已成功地将文件缩减到仅包含时间戳,例如:

2008年9月22日20:00:21+0000
2008年9月22日20:00:22+0000
2008年9月22日20:00:22+0000
2008年9月22日20:00:22+0000
2008年9月22日20:00:24+0000
2008年9月22日20:00:24+0000

我想得到的是每个唯一时间戳在文件中出现的次数。例如,在上面的示例中,我希望得到如下输出:

2008年9月22日20:00:21+0000:1
2008年9月22日20:00:22+0000:3
2008年9月22日20:00:24+0000:2

我使用了
sort-u
将时间戳列表过滤为唯一标记列表,希望可以像grep一样使用它

grep -c -f <file containing patterns> <file>
grep-c-f
但这只产生了一行匹配行的总和


我知道这可以在一条线上完成,将一些实用程序串在一起。。。但我想不出是哪个。有人知道吗?

我想你在找

uniq --count
-c、 --伯爵 按出现次数为行添加前缀


也许使用xargs?在这里,我不能把所有的东西都放在我的脑海里,但是在你的sort-u上使用xargs,这样每一秒你都可以把原始文件变灰,然后做一个wc-l来获得数字

将AWK与关联数组一起使用可能是解决类似问题的另一种解决方案。

以防您希望以最初指定的格式输出(出现次数在末尾):

使用:

汤姆的解决方案:

awk '{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}' file.txt
更普遍地说,它起作用

我的文件未排序:

name1 
name2 
name3 
name2 
name2 
name3 
name1
因此,这些事件并不相互遵循,并且
uniq
无法按其给出的方式工作:

1 name1 
1 name2 
1 name3 
2 name2 
1 name3 
1 name1
但是,对于awk脚本:

name1:2 
name2:3 
name3:2

请注意,对于其他数据集,您可能需要在uniq(1)之前对(1)进行排序,因为uniq只会对相邻的重复项进行分组。是的,但OP已经说他已经对事物进行了排序,所以我假设他是这类事物的最高级……我不得不在OSX上使用
uniq-c
--count
给了我一个错误。
1 name1 
1 name2 
1 name3 
2 name2 
1 name3 
1 name1
name1:2 
name2:3 
name3:2