Bash 如何使用awk将带有标题的新列添加到csv

Bash 如何使用awk将带有标题的新列添加到csv,bash,csv,awk,Bash,Csv,Awk,我在处理CSV的bash脚本中使用了一些awk。awk做到了这一点: ORIG_FILE="score_model.csv" NEW_FILE="updates/score_model.csv" awk -v d="2017_01" -F"," 'BEGIN {OFS = ","} {$(NF+1)=d; print}' $ORIG_FILE > $NEW_FILE 这一转变的目的是: # before model_description, type, e

我在处理CSV的bash脚本中使用了一些awk。awk做到了这一点:

ORIG_FILE="score_model.csv"   
NEW_FILE="updates/score_model.csv"    
awk -v d="2017_01" -F"," 'BEGIN {OFS = ","} {$(NF+1)=d; print}' $ORIG_FILE > $NEW_FILE 
这一转变的目的是:

# before
model_description,      type,    effective_date, end_date
Inc <= 40K,             Retired, 08/05/2016,     07/31/2017
Inc > 40K Age <= 55 V5, Retired, 04/30/2016,     07/31/2017
Inc > 40K Age > 55 V5 , Retired, 04/30/2016,     07/31/2017

# after, bad
model_description,      type,    effective_date, end_date,   2017_01  
Inc <= 40K,             Retired, 08/05/2016,     07/31/2017, 2017_01
Inc > 40K Age <= 55 V5, Retired, 04/30/2016,     07/31/2017, 2017_01
Inc > 40K Age > 55 V5 , Retired, 04/30/2016,     07/31/2017, 2017_01
#之前
型号说明、类型、生效日期、结束日期
Inc 40K年龄40K年龄>55岁V5,退休,2016年4月30日,2017年7月31日
#之后,很糟糕
型号说明、类型、生效日期、结束日期、2017年1月
Inc 40K年龄40K年龄>55岁V5,退休,2016年4月30日,2017年7月31日,2017年1月
我希望新列有一个标题,这样新的CSV看起来像

# after, desired
model_description,      type,    effective_date, end_date,   cmpgn_group  
Inc <= 40K,             Retired, 08/05/2016,     07/31/2017, 2017_01
Inc > 40K Age <= 55 V5, Retired, 04/30/2016,     07/31/2017, 2017_01
Inc > 40K Age > 55 V5 , Retired, 04/30/2016,     07/31/2017, 2017_01
#之后,需要
型号说明、类型、生效日期、结束日期、cmpgn组
Inc 40K年龄40K年龄>55岁V5,退休,2016年4月30日,2017年7月31日,2017年1月
我知道有一种方法可以分别在第一行中指定要执行的操作,但我还没有弄清楚。

遵循awk(解决方案中有点变化)应该适合您

awk -v d="2017_01" 'BEGIN{FS=OFS=","} {print $0, (NR>1?d:"cmpgn_group")}' file
ORIG_FILE="score_model.csv"   
NEW_FILE="updates/score_model.csv"    
awk -v d="2017_01" -F"," 'BEGIN {OFS = ","} FNR==1{$(NF+1)="cmpgn_group"} FNR>1{$(NF+1)=d;} 1' $ORIG_FILE > $NEW_FILE 
解决方案2:或者让我们删除此
$(NF+1)(
创建新的字段方法)并尝试直接打印它

awk -v d="2017_01" -F"," 'BEGIN {OFS = ","} {printf("%s%s",$0,FNR>1?d RS:"cmpgn_group" RS)}' $ORIG_FILE > $NEW_FILE
上述命令说明:

model_description,      type,    effective_date, end_date,      cmpgn_group
Inc <= 40K,             Retired, 08/05/2016,     07/31/2017,    2017_01
Inc > 40K Age <= 55 V5, Retired, 04/30/2016,     07/31/2017,    2017_01
Inc > 40K Age > 55 V5 , Retired, 04/30/2016,     07/31/2017,    2017_01

使用sed

$ sed '1s/$/,\tcmpgn_group/; 2,$s/$/,\t2017_01/' file
i、 e代表
第1行
:追加
,\tcmpgn\u组

对于
2到$
:追加
,\t2017\u 01

使用awk

$ awk -v d="2017_01" -F"," 'FNR==1{a="cmpgn_group"} FNR>1{a=d} {print $0",\t"a}' f1
输出:

model_description,      type,    effective_date, end_date,      cmpgn_group
Inc <= 40K,             Retired, 08/05/2016,     07/31/2017,    2017_01
Inc > 40K Age <= 55 V5, Retired, 04/30/2016,     07/31/2017,    2017_01
Inc > 40K Age > 55 V5 , Retired, 04/30/2016,     07/31/2017,    2017_01
型号描述、类型、生效日期、结束日期、cmpgn组
Inc 40K年龄40K年龄>55岁V5,退休,2016年4月30日,2017年7月31日,2017年1月