Bash脚本输出CSV异常:多行内容挤入同一列问题求助
解决CSV输出内容挤在同一列的问题
我一眼就看出问题出在两个地方:Awk输出的字段分隔符不对,还有循环里的重写覆盖问题,咱们一步步解决:
问题1:输出字段用空格分隔,导致CSV识别为同一列
你的Awk语句里用print $4,$3,$9,Awk默认的输出字段分隔符(OFS)是空格,所以输出的内容是用空格分开的,而CSV是用逗号分隔列,所以Excel或者CSV阅读器会把整行当成一列。
问题2:循环中每次重写文件,最终只剩最后一个文件的结果
你用了> "201_testing.csv",这会在每次循环时清空文件再写入,所以最后只有最后一个匹配的CSV文件的结果,而不是所有文件的内容累加。
修正后的脚本
#!/bin/bash files=( XW[1-2]something[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].csv) # 先清空目标文件(如果需要从头开始的话) > "201_testing.csv" for i in "${files[@]}"; do # 设置Awk的输出字段分隔符为逗号,同时追加到文件 awk -F "," 'BEGIN{OFS=","} {if($2=="303" && match($4,/^AB[0-9]/) && $5=="3"){print $4,$3,$9;}}' "$i" >> "201_testing.csv" done
关键修改点说明
- 添加
BEGIN{OFS=","}:告诉Awk输出字段之间用逗号分隔,符合CSV格式要求。 - 把
>改成>>:每次循环将结果追加到目标文件,而不是覆盖之前的内容。 - 给
${files[@]}和$i加上双引号:避免文件名里有空格等特殊字符时出错。 - 开头加
> "201_testing.csv":如果目标文件已经存在,先清空它,避免之前的残留内容影响结果。
这样处理后,生成的201_testing.csv里的内容就会按逗号分隔成不同列,而且会包含所有匹配文件的符合条件的行啦。
内容的提问来源于stack exchange,提问作者mynameisJEFF
相关产品推荐
相关产品推荐

