假设您有一个包含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:
有人问为什么在例如perl中更容易用bash进行操作呢?原因是在我必须执行此操作的机器上,我无法使用perl。这是一台定制的Linux机器,没有我惯用的大多数工具。我认为这是一个有趣的问题。
因此,请不要怪这个问题,如果您不喜欢它,那就忽略它。:-)