假设您有以下内容。
192.168.0.100
192.168.0.100
192.168.0.100
192.168.0.102
192.168.0.102
192.168.0.100
这被认为是3个独特的点击。区分它的方法是连续相同的IP算作一个。你将如何循环文件并相应计数?
答案 0 :(得分:10)
如果您的uniq
与我的相似,并且只按顺序使用相似的字符串,则不要在uniq
之前排序:
file foo.txt:
192.168.0.100
192.168.0.100
192.168.0.100
192.168.0.102
192.168.0.102
192.168.0.100
和
$ cat foo.txt | uniq -c
编辑:我可以给自己一个useless use of cat奖励吗?
$ uniq -c foo.txt
<强> /修改
输出:
3 192.168.0.100
2 192.168.0.102
1 192.168.0.100
答案 1 :(得分:3)
我会避免使用bash。使用像Python,awk甚至Perl这样的真实语言。
的Python
#!/usr/bin/env python
from __future__ import print_function
import fileinput
def combine( source ):
count, prev= 1, source.next()
for line in source:
if line == prev:
count += 1
else:
yield count, prev
count, prev = 1, line
yield count, prev
for count, text in combine( fileinput.input() ):
print( count, text )
与bash相比简单且极其快速。
由于这是从stdin读取并写入stdout,因此可以将其用作管道中的简单命令。
答案 2 :(得分:1)
我不熟悉bash脚本,但想法是跟踪以前检查过的IP。那么如果前一个==当前,不要递增,否则递增?
答案 3 :(得分:0)
与@ Wrikken的答案类似,但我认为你想要总数:
如果包含上述数据的文件是foo.txt,则:
$ cat foo.txt | uniq | wc -l
3
我想你想要的是什么。