你会如何分组一些行?

时间:2010-08-03 22:38:55

标签: bash

假设您有以下内容。

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算作一个。你将如何循环文件并相应计数?

4 个答案:

答案 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

我想你想要的是什么。