假设有一些域名,存储在nowcoder.txt里,现在需要写一个shell脚本,将域名取出并根据域名进行计数排序处理(降序)。
假设nowcoder.txt内容如下:
http://www.nowcoder.com/index.html http://www.nowcoder.com/1.html http://m.nowcoder.com/index.html
你的脚本应该输出:
2 www.nowcoder.com 1 m.nowcoder.com
http://www.nowcoder.com/index.html http://www.nowcoder.com/1.html http://m.nowcoder.com/index.html
2 www.nowcoder.com 1 m.nowcoder.com
1
1
http://www.nowcoder.com/index.html http://www.nowcoder.com/1.html http://m.nowcoder.com/index.html
2 www.nowcoder.com 1 m.nowcoder.com
# 方法1: 使用awk
# 打框架:awk -F "/" 'BEGIN{}{}END{}' nowcoder.txt | sort -k1
# 借用个字典,启动key是域名, value是次数, 则awk -F "/" 'BEGIN{dict}{}END{for(i in dict) {printf("%d %s\n", i, dict[i])}}' nowcoder.txt | sort -rk1
# BEGIN可以省略不写,则awk -F "/" '{}END{for(i in dict) {printf("%d %s\n", i, dict[i])}}' nowcoder.txt | sort -rk1
# 最终得到如下:
awk -F "/" '{if($3!=""){dict[$3]+=1}}END{for(i in dict) {printf("%d %s\n", dict[i], i)}}' nowcoder.txt | sort -rk1
# 方法2: 使用最笨的while read line
declare -A dict # 其中key是域名, value是次数
while read -r line; do
# 首先将前缀去掉
data=${line#http://}
# 然后将后缀去掉
data=${data%%/*}
# 将其放进字典里面取
# 如果不存在该key,则赋值为1, 否则则加1
if [[ -z ${dict[${data}]} ]]; then
dict[${data}]=1
else
((dict[${data}]+=1))
fi
done < nowcoder.txt
# 打印字典
# shellcheck disable=SC2068
for key in ${!dict[@]}; do
echo "${dict[${key}]} ${key}"
done | sort -rk1
# 方法3:借助uniq, 现将域名过滤出来,然后按照名字排序,排序后去重,再按照次数排序, 最后按照格式输出
awk -F '/' '{print $3}' nowcoder.txt | sort | uniq -c | sort -rk1 | awk -F " " '{print $1" "$2}' awk '{str = gensub(/(.*)\/\/([a-zA-Z0-9.]*)\/(.*)/, "\\2", "g"); a[str]++} END{for(i in a){print(a[i]" "i)}}' nowcoder.txt | sort -nr
while read line;
do
line=${line#*//}; echo ${line%%/*} | awk '{a[$0]++}END{for(i in a){print a[i],i}}'
done