在Bash(>=3)中将CSV布尔枚举转换为位域
CSV列转PASS/FAIL位域实现方案
需求说明
给定一行CSV数据:
arbitrary descriptor, uid, PASS, FAIL, NA, PASS, PASS, CLEAR
需将每一列转换为位域值:标记为PASS的列对应1,其余列对应0,最终得到结果00100110(等价于十六进制0x26或十进制38)。
可行实现方案
1. 使用awk实现
echo "arbitrary descriptor, uid, PASS, FAIL, NA, PASS, PASS, CLEAR" | awk -F', ' '{ for(i=1; i<=NF; i++) { printf "%d", $i ~ /^PASS$/ ? 1 : 0 } print "" }'
说明:以, 作为字段分隔符,遍历所有字段,判断字段是否为PASS,逐个输出1或0,最终拼接成连续字符串。
2. 使用sed实现
echo "arbitrary descriptor, uid, PASS, FAIL, NA, PASS, PASS, CLEAR" | sed -E 's/, /\n/g' | sed -E 's/^PASS$/1/; s/^.*$/0/' | tr -d '\n'
说明:先将CSV分隔符替换为换行,把每个字段单独成行;再将PASS替换为1,其余所有行替换为0;最后删除换行符得到连续位串。
3. Bash原生实现(无需外部工具)
csv_data="arbitrary descriptor, uid, PASS, FAIL, NA, PASS, PASS, CLEAR" IFS=', ' read -ra fields <<< "$csv_data" bit_string="" for field in "${fields[@]}"; do [[ "$field" == "PASS" ]] && bit_string+="1" || bit_string+="0" done echo "$bit_string"
说明:通过Bash的数组读取CSV字段,循环判断每个字段是否为PASS,拼接生成位串。
原尝试代码问题说明
- 你之前的awk代码未遍历所有字段,缺少字段循环逻辑,无法处理每一列;
- sed代码存在语法错误(未闭合引号),且替换逻辑未正确覆盖所有非
PASS字段,导致结果不符合预期。
内容的提问来源于stack exchange,提问作者Quinn Carver
相关产品推荐
相关产品推荐

