假设你有一个包含IP地址的文件,每行一个地址:
10.0.10.1
10.0.10.1
10.0.10.3
10.0.10.2
10.0.10.1
您需要一个shell脚本来计算每个IP地址在文件中出现的次数。对于前面的输入,您需要以下输出:
10.0.10.1 3
10.0.10.2 1
10.0.10.3 1
一种方法是:
cat ip_addresses |uniq |while read ip
do
echo -n $ip" "
grep -c $ip ip_addresses
done
然而,它真的是远远不是有效的。
如何使用bash更有效地解决这个问题?
(有一件事要补充:我知道它可以从perl或awk解决,我对bash中更好的解决方案感兴趣,而不是在那些语言中。)
额外的信息:
假设源文件是5GB,运行算法的机器有4GB。所以排序不是一个有效的解决方案,多次读取文件也不是。
我喜欢类似散列表的解决方案-任何人都可以提供改进的解决方案?
附加信息#2:
有些人问我为什么要在bash中做,而在例如perl中更容易。原因是,在机器上,我必须这样做perl是不可为我。这是一台定制的linux机器,没有我使用过的大多数工具。我认为这是一个有趣的问题。
所以,请不要责怪这个问题,如果你不喜欢它,就忽略它。:-)