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

如何在Shell脚本中按条件生成CSV新列并拼接字段?

Shell脚本生成指定格式CSV文件解决方案

需求说明

现有inputfile.csv文件内容如下:

id,flag
1,Y
2,N
3,Y

定义Shell变量:

key="x2"

需要生成output.csv文件,新增file_nm列:

  • 当flag为Y时,file_nm格式为id_key.pdf(例如1_x2.pdf)
  • 当flag为N时,file_nm为UNK

最终输出的output.csv格式要求:

id,flag,file_nm
1,Y,1_x2.pdf
2,N,UNK
3,Y,3_x2.pdf

用户的错误尝试

用户尝试了以下awk命令,但输出异常:

key="x2" ## key can change
awk -F"," 'NR==1{$3="PDF_FILE_NM";print;next} $2 == "Y" {$3=$1"_"$key".pdf"}; $2 == "N" {$3="UNK"}1' OFS="," ./inputfile.csv > ouput.csv

错误原因

  1. Shell变量无法直接在awk中引用:awk有独立的变量空间,直接写$key无法读取Shell定义的key变量值
  2. 表头列名错误:需求中新增列名为file_nm,但代码中写的是PDF_FILE_NM
  3. 输出文件名拼写错误:将output.csv写成了ouput.csv

正确脚本方案

方案一:使用awk的-v选项传递变量(推荐)

通过-v参数将Shell变量传递给awk,同时简化逻辑:

key="x2"
awk -F"," -v key="$key" 'BEGIN{OFS=","} 
NR==1 {$3="file_nm"} 
NR>1 {$3=($2=="Y") ? $1"_"key".pdf" : "UNK"} 
1' inputfile.csv > output.csv
  • -v key="$key":把Shell的key变量值传递给awk内部的key变量
  • BEGIN{OFS=","}:提前设置输出字段分隔符为逗号,避免后续格式混乱
  • NR==1:处理表头,添加新列名
  • NR>1:处理数据行,用三元表达式判断flag值,生成对应file_nm内容
  • 末尾的1:awk中1表示执行默认操作(打印当前行)

方案二:直接拼接输出内容

如果觉得字段修改逻辑复杂,也可以直接拼接每行内容输出:

key="x2"
awk -F"," -v key="$key" '
NR==1 {print $0",file_nm"; next}
$2=="Y" {print $0","$1"_"key".pdf"}
$2=="N" {print $0",UNK"}
' inputfile.csv > output.csv

这种方式更直观,直接在原有行末尾追加新列内容。

内容的提问来源于stack exchange,提问作者rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:28