我有一张表,比如说 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 来完成这项任务。请指教!
从您那里
1.csv
您可以通过获得第3天的出勤率
awk -F, 'NR>1 {c+=$4} END {print c}' 1.csv
使用 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