如何在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
错误原因
- Shell变量无法直接在awk中引用:awk有独立的变量空间,直接写
$key无法读取Shell定义的key变量值 - 表头列名错误:需求中新增列名为
file_nm,但代码中写的是PDF_FILE_NM - 输出文件名拼写错误:将
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
相关产品推荐
相关产品推荐

