如何修改Awk脚本以对齐CSV文件第5-9列与第1列的值?
用Awk正确解析带引号的CSV字段
你的问题核心是CSV里混合了带引号和不带引号的字段(比如第4列的布尔值无引号,其他列带引号),默认的Awk逗号分割逻辑会因为引号内的字符(甚至逗号)导致字段索引错位,最终丢失第5-9列内容。不用预处理去引号,直接用Awk实现CSV字段解析即可解决:
输入样本示例
ID,"Name","Description",true,"Val1","Val2","Val3","Val4","Val5" 1,"Alice","Engineer, Senior",false,10,20,30,40,50 2,"Bob","Designer",true,15,25,35,45,55
期望输出示例
ID: 1, Val1:10, Val2:20, Val3:30, Val4:40, Val5:50 ID: 2, Val1:15, Val2:25, Val3:35, Val4:45, Val5:55
修改后的Awk脚本
#!/usr/bin/awk -f function parse_csv(line, n, i, in_quote, curr_field) { n = 0 in_quote = 0 curr_field = "" for (i = 1; i <= length(line); i++) { char = substr(line, i, 1) if (char == "\"") { in_quote = !in_quote continue # 跳过引号本身,不保留在字段内容里 } if (char == "," && !in_quote) { fields[++n] = curr_field curr_field = "" } else { curr_field = curr_field char } } fields[++n] = curr_field # 加入最后一个字段 return n } NR > 1 { # 跳过表头行 field_count = parse_csv($0) printf "ID: %s, Val1:%s, Val2:%s, Val3:%s, Val4:%s, Val5:%s\n", fields[1], fields[5], fields[6], fields[7], fields[8], fields[9] }
脚本说明
parse_csv函数:逐字符扫描每行,通过in_quote标记判断是否处于引号内,只有不在引号里的逗号才作为字段分隔符,同时自动剔除字段的引号。- 解析后的字段存在
fields数组,直接按索引取对应列即可,不管原字段是否带引号、是否包含逗号,都能保证列索引正确。 NR > 1用于跳过第一行表头,只处理数据行。
运行方式
- 把脚本保存为
align_csv.awk - 给脚本加执行权限:
chmod +x align_csv.awk - 执行脚本处理你的CSV文件:
./align_csv.awk your_input.csv
内容的提问来源于stack exchange,提问作者Gifter Villanueva
相关产品推荐
相关产品推荐

