Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 你将如何对多行进行分组?_Bash - Fatal编程技术网

Bash 你将如何对多行进行分组?

Bash 你将如何对多行进行分组?,bash,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数为一。您将如何循环浏览该文件并进行相应的计数 我不熟悉bash脚本,但我的想法是跟踪以前检查过的IP。然后,如果previous==current,则不递增,否则递增?我将避免为此使用bash。使用真正的语言,比如Python、awk甚至Perl 蟒蛇

假设你有以下几点

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数为一。您将如何循环浏览该文件并进行相应的计数

我不熟悉bash脚本,但我的想法是跟踪以前检查过的IP。然后,如果previous==current,则不递增,否则递增?

我将避免为此使用bash。使用真正的语言,比如Python、awk甚至Perl

蟒蛇

#!/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,您可以将其用作管道中的一个简单命令。

如果您的
uniq
与我的类似,并且只能按顺序处理相似的字符串,只需在
uniq
之前排序即可:

文件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
以及:

编辑:我能给自己颁奖吗

/edit
输出:


与@Wrikken的答案类似,但我认为您需要总计数:

如果包含上述数据的文件是foo.txt,则:

$ cat foo.txt | uniq | wc -l
3

我想这正是您想要的。

可能分两次完成:首先遍历并合并连续的IP,然后计算文件中的所有行数?可能与“在bash中”的确切含义重复?删除连续的重复项是“uniq”的工作,所以要解决这个问题,“cat数据| uniq | wc-l”应该将其删除。。。但它是“bash”吗?@sheepsimulator:我认为你的解决方案在这里行不通。只有两个IP:100和102,但它被算作3次点击。所以非连续IP可能会计数两次。你的意思是说连续相同的IP可以计数为一个吗?很好,但我不太确定它是否解决了OP的问题。上述数据集应返回地图中的三组,而不是两组。我的Python不是很好,但乍一看,我会说这会返回两个组。如果同一个IP有两个条目,中间有另一个IP,那么这算对了吗?我认为您需要区分相同ip的第1次、第2次和第N次出现,前提是它们不是连续的。另外,请指定您使用的Python版本,顶部可能有一个shebang。@Hamish Grubijan:这将适用于任何包含collections.defaultdict的版本。即>=2.5。已更正以处理非邻接问题。
$ uniq -c foo.txt
  3 192.168.0.100
  2 192.168.0.102
  1 192.168.0.100
$ cat foo.txt | uniq | wc -l
3