You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计CSV中满足条件的人数?Excel与awk/bash实现咨询

出勤统计方案(Excel + Awk/Bash实现)

数据源说明

现有三个CSV文件记录出勤信息:

  1. 1.csv(原始出勤记录):
name,1st,2nd,3rd,4th
Alice,1,1,0,0
bob,0,1,1,1
Clara,1,0,1,0
  1. 2.csv(十六进制压缩版):
name,hex
alice,c
bob,7
clara,a
  1. 3.csv(单行横向存储版):
alice,c,bob,7,clara,a

MS Excel实现方案

针对2.csv的分步处理(优先推荐)

  1. 将2.csv导入Excel,数据区域为A1:B4(A1为name,B1为hex)。
  2. 十六进制转4位二进制:在C2单元格输入公式,下拉填充至C4:
    =DEC2BIN(HEX2DEC(B2), 4)
    
    该公式将十六进制值转为固定4位的二进制字符串,左到右依次对应1st、2nd、3rd、4th的出勤状态。
  3. 提取第三天出勤状态:在D2单元格输入公式,下拉填充至D4:
    =MID(C2, 3, 1)
    
    通过MID提取二进制字符串的第3位,得到第三天的出勤值(1=出勤,0=缺勤)。
  4. 统计出勤人数:在任意空白单元格输入:
    =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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:00:27