如何从现有CSV文件的选中列动态生成新的CSV文件
解决方案
方案1:cut命令实现(适合无字段内嵌逗号的标准CSV)
你之前使用cut报错存在两个问题:一是未将数组转换为cut要求的逗号分隔格式,二是未指定CSV的分隔符为逗号(cut默认分隔符为制表符)。
正确操作步骤:
- 把存储列索引的数组转换为逗号分隔的字符串
cols_str=$(IFS=,; echo "${cols_needed[*]}")
- 直接调用cut筛选列
cut -d',' -f"$cols_str" test.csv > output.csv
方案2:awk命令实现(适配更复杂的自定义逻辑)
你之前的awk命令出错原因:一是传递fields参数时没有用引号包裹数组展开结果,导致空格分隔的多个索引被识别为awk的多个入参;二是未指定CSV的逗号分隔符;三是split未显式指定按空格拆分。
正确代码:
awk -v fields="${cols_needed[*]}" -F',' ' BEGIN{ n = split(fields, f, " ") OFS = "," } { for (i=1; i<=n; ++i) { printf "%s%s", $f[i], (i < n ? OFS : ORS) } }' test.csv > output.csv
注意事项
- 如果你的CSV存在字段内部带引号包裹的逗号(例如
"北京,上海",100,200),以上基础命令无法正确识别字段边界,建议使用专门的CSV处理工具csvkit,对应命令为csvcut -c "$cols_str" test.csv > output.csv - 以上方案均默认列索引从1开始计数,和你存储的数组规则匹配。
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

