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