事情起因于一个面试题:
一个文件(data.txt)有很多IP地址,每一行一个IP地址,有很多重复的IP地址。写一脚本找出重复最多的IP地址个数?
我的解决思路:先排序,然后遍历所有行,计算出重复次数最多的行。
代码(cal.sh):
#! /bin/bash
sort $1 > ./tmp.txt
max=0
count=0
pre=$(head -1 tmp.txt)
for curr in $(cat tmp.txt)
do
if [ "$pre" = "$curr" ] ; then
count=$(($count+1))
if [ "$max" -lt "$count" ]; then
max=$count
fi
else
pre=$curr
count=1
fi
done
rm ./tmp.txt
echo "$max"
脚本使用方法:cal.sh data.txt
在提示linux下有个命令uniq -c的作用后,bash脚本就简单多了:
#! /bin/bash
sort $1 | uniq -c | sort | tail -1
注:uniq -c的作用是去除连续的重复行,同时在行首显示连续重复行的个数。
相比较两套代码,可以深刻体会到:熟悉常用命令的功能,利用命令的巧妙组合完成特定任务,效率往往要高很多。