求助:Unix下awk统计SAS数据集行数不符,求替代命令
统计SAS数据集行数的正确Unix方法
哦,我太懂这种踩坑的感觉了!用awk 'END {print NR}'去读.sas7bdat文件肯定得不到正确结果的——因为SAS数据集是二进制格式,不是纯文本文件,awk会把二进制里的随机换行符当成记录分隔符,统计出来的自然是错的数值。
给你几个靠谱的解决方案,按推荐程度排序:
1. 用SAS自带命令行工具(最准确,无需额外安装)
SAS本身就支持命令行批量执行脚本,我们可以写个极简的SAS程序来统计行数,直接在Unix终端运行:
sas -stdio -noterminal <<EOF libname mylib "/home/user"; # 替换成你的数据集所在目录 proc sql; select count(*) as total_observations from mylib.check; quit; EOF
这个方法会返回精确的观测数,因为是SAS自己解析数据集,不会出错。如果觉得输出太啰嗦,还可以加noprint选项把结果存到变量里再打印:
sas -stdio -noterminal <<EOF libname mylib "/home/user"; data _null_; set mylib.check nobs=total; put total; stop; run; EOF
这个脚本会直接输出纯数字的行数,更适合后续脚本处理。
2. 用第三方工具解析SAS数据集(更快捷)
如果你的系统允许安装工具,可以用专门处理.sas7bdat的开源工具,比如Python的sas7bdat_tools:
首先用pip安装(如果没装pip的话先装):
pip install sas7bdat_tools
然后直接运行命令查看行数:
sas7bdat-info /home/user/check.sas7bdat | grep "Number of observations"
输出会类似Number of observations: 247,一目了然。
另一个选项是用csvkit先转成CSV再统计:
# 先安装csvkit pip install csvkit # 转成CSV后统计行数,减去表头行 in2csv /home/user/check.sas7bdat | wc -l | awk '{print $1 - 1}'
这个方法适合需要同时处理CSV的场景,但转格式会消耗一点时间,大数据集可能慢一些。
为什么之前的awk不行?
再啰嗦一句:.sas7bdat文件里存储的是二进制结构,包含元数据、索引、压缩的观测值等,不是一行行的文本记录。awk是按文本行来计数的,所以它统计的是二进制文件里的换行符数量,和实际观测数完全没关系~
内容的提问来源于stack exchange,提问作者MPUSA
相关产品推荐
相关产品推荐

