低内存高效awk/shell命令:统计同时拥有apple和oranges的人数
高效统计同时拥有指定项的用户数量
针对你这种大型数据文件的统计需求,要兼顾低内存占用和快执行速度,用awk是最优选择——它可以逐行处理数据,不用把整个文件加载到内存里,完美适配大文件场景。
实现命令
BEGIN { FS="," } { if ($4 == "apple") users[$1] |= 1; else if ($4 == "oranges") users[$1] |= 2; } END { count=0; for (user in users) if (users[user] == 3) count++; print count; }
命令细节解释
BEGIN { FS="," }:先设置字段分隔符为逗号,告诉awk如何拆分每行的内容,确保能准确提取第1列和第4列数据。- 逐行处理时,用一个哈希数组
users记录每个用户的状态:- 如果当前行第4列是
apple,给该用户的标记位加上1(用位运算|=比普通赋值更高效,且节省内存)。 - 如果是
oranges,给标记位加上2。
- 如果当前行第4列是
- END块:遍历所有用户,只有当标记位等于3(也就是同时拥有1和2,意味着该用户既有apple又有oranges记录)时,计数加一,最后输出总数量。
为什么这个方案符合要求
- 内存占用极低:数组
users只存储每个用户的一个整数标记,不管该用户有多少条记录,都只占一条数组项,内存占用不会随文件行数线性增长。 - 执行速度极快:awk是原生文本处理工具,逐行处理无额外IO开销,位运算也比字符串拼接/判断更高效,能快速跑完大文件。
把你的测试数据输入后,这个命令会输出2,正好对应jon和tom两个符合条件的用户。
内容的提问来源于stack exchange,提问作者Nitish Nambiar
相关产品推荐
相关产品推荐

