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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:27