如何统计CSV中满足条件的人数?Excel与awk/bash实现咨询
出勤统计方案(Excel + Awk/Bash实现)
数据源说明
现有三个CSV文件记录出勤信息:
- 1.csv(原始出勤记录):
name,1st,2nd,3rd,4th Alice,1,1,0,0 bob,0,1,1,1 Clara,1,0,1,0
- 2.csv(十六进制压缩版):
name,hex alice,c bob,7 clara,a
- 3.csv(单行横向存储版):
alice,c,bob,7,clara,a
MS Excel实现方案
针对2.csv的分步处理(优先推荐)
- 将2.csv导入Excel,数据区域为
A1:B4(A1为name,B1为hex)。 - 十六进制转4位二进制:在
C2单元格输入公式,下拉填充至C4:
该公式将十六进制值转为固定4位的二进制字符串,左到右依次对应1st、2nd、3rd、4th的出勤状态。=DEC2BIN(HEX2DEC(B2), 4) - 提取第三天出勤状态:在
D2单元格输入公式,下拉填充至D4:
通过=MID(C2, 3, 1)MID提取二进制字符串的第3位,得到第三天的出勤值(1=出勤,0=缺勤)。 - 统计出勤人数:在任意空白单元格输入:
最终结果为=COUNTIF(D2:D4, "1")2(对应bob和Clara第三天出勤)。
针对1.csv的快速处理
如果直接使用原始数据,无需转换,直接统计3rd列的1数量:
=COUNTIF(C2:C4, 1)
(注:C列为1.csv中的3rd列)
Awk/Bash实现方案
处理1.csv(原始数据)
直接统计第三日出勤(对应第4列,表头后从第二行开始):
awk -F ',' 'NR>1 && $4==1 {count++} END {print count}' 1.csv
处理2.csv(十六进制压缩版)
通过位运算提取第三天的出勤状态(兼容性优于二进制字符串转换,避免依赖特定Awk函数):
awk -F ',' 'NR>1 { dec = strtonum("0x" $2) # 十六进制转十进制 third = (dec >> 1) & 1 # 右移1位后取最低位,对应第三天的出勤状态 if (third == 1) count++ } END {print count}' 2.csv
逻辑说明:4天的出勤对应二进制位从高到低为1st(位3)、2nd(位2)、3rd(位1)、4th(位0),右移1位后取最低位即可得到3rd的状态。
处理3.csv(单行横向存储版)
遍历单行中的成对name-hex数据,用相同的位运算逻辑统计:
awk -F ',' '{ for (i=1; i<=NF; i+=2) { # 步长为2,依次取name和对应的hex值 dec = strtonum("0x" $(i+1)) third = (dec >> 1) & 1 if (third == 1) count++ } } END {print count}' 3.csv
内容的提问来源于stack exchange,提问作者user15181
相关产品推荐
相关产品推荐

