如何在CSV中计算满足某些条件的人数

问题描述 投票:0回答:2

我有一张表,比如说 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 来完成这项任务。如何实施? 预先感谢,

我认为以下 Excel 内置函数可以完成该任务,

=DEC2BIN(HEX2DEC(B2), 4)
=MID(DEC2BIN(HEX2DEC(B2), 4), 3, 1)
=COUNTIF(C2:C4, "1")

如果可行的话,我更喜欢使用 awk/bash 来完成这项任务。请指教!

excel bash awk
2个回答
0
投票

从您那里

1.csv
您可以通过

获得第3天的出勤率
awk -F, 'NR>1 {c+=$4} END {print c}' 1.csv

0
投票

使用 GNU awk(按位

and()
以及使用 gawk
strtonum()
)从文件中获取与会者数量
3.csv

该格式的问题是我们不知道事件持续的确切天数,因此假设为 4 天,因此使用常数 (2^4=) 16。这当然也可以参数化。

$ gawk -v d=3 '
BEGIN {
    FS=","                                # delimiter
    d=16/2^d                              # figuring out a value for and()
}
{
    for(i=2;i<=NF;i+=2)                   # iterating hex bitfields
        s+=(and(strtonum("0x" $i),d)&&1)  # the logic behind the solution is logic
}
END {
    print s
}' 3.csv

输出为第 3 天的参加人数:

2

1.csv
2.csv
(因为我首先读错了问题):

$ awk '
BEGIN {
    FS=","
}
{
    for(i=2;i<=NF;i++)
        s=2*s+$i
    printf "%s,"(NR==1?"hex":"%x")"\n",$1,s
    s=0
}' 1.csv # > 2.csv

name,hex
Alice,c
bob,7
Clara,a
© www.soinside.com 2019 - 2024. All rights reserved.