如何统计Steam数据集中每个steamid的好友数量?
解决方案
针对你的Steam好友数据集统计需求,以下是基于命令行工具的高效处理方案,适配3200万条数据的规模:
前提说明
首先需要处理数据中的两个问题:
- 部分
steamid/steamid_b带有*符号,需先清理 - 存在大量重复的好友关系记录,需去重后统计
方案1:仅统计用户作为steamid时的唯一好友数
(即只计算该用户主动关联的好友,忽略其他用户将其加为好友的情况)
# 替换your_data.csv为你的数据集文件名 sed '1d' your_data.csv | sed 's/\*//g' | sort -t' ' -k1,1 -k2,2 -u | awk '{count[$1]++} END {for (id in count) print id, count[id]}'
步骤解释:
sed '1d' your_data.csv:删除表头行sed 's/\*//g':清除所有*符号,统一steamid格式sort -t' ' -k1,1 -k2,2 -u:以空格为分隔符,按steamid和steamid_b排序并去重,保留唯一的好友关系对awk '{count[$1]++} END {for (id in count) print id, count[id]}':统计每个steamid对应的唯一好友数量
方案2:统计用户的所有关联好友(双向关系)
(即同时计算该用户主动关联的好友,以及将该用户加为好友的用户,对应你例子中76561197960265733的好友数为2的需求)
# 替换your_data.csv为你的数据集文件名 sed '1d' your_data.csv | sed 's/\*//g' | awk '{print $1, $2; print $2, $1}' | sort -t' ' -k1,1 -k2,2 -u | awk '{count[$1]++} END {for (id in count) print id, count[id]}'
步骤解释:
- 前两步同方案1,处理表头和清理符号
awk '{print $1, $2; print $2, $1}':将每条单向好友关系拆分为双向记录(如a b拆为a b和b a),确保双方都能统计到彼此sort -t' ' -k1,1 -k2,2 -u:对双向记录去重,避免重复统计同一对好友- 最后用awk统计每个用户的唯一好友总数
性能优化建议(针对3200万条数据)
- 排序时指定内存:使用
sort -S 16G(根据你的机器内存调整,内存越大排序速度越快) - 若数据用制表符分隔,将
-t' '改为-t$'\t' - 可加入
pv命令查看处理进度:sed '1d' your_data.csv | pv | sed 's/\*//g' | ... - GNU sort默认支持多线程,无需额外配置即可利用多核资源
内容的提问来源于stack exchange,提问作者Ji Xu
相关产品推荐
相关产品推荐

