[英]How to add new column with header to csv with awk
I'm using some awk inside a bash script that's handling CSVs. 我在一个处理CSV的bash脚本中使用了一些awk。 The awk does this: 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
Which does this transformation: 这种转变是做什么的:
# 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
I want the new column to have a header, so that the new CSV looks like 我希望新列有一个标题,以便新的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
I know there's a way to specify what to do in the first row separately, but I haven't been able to figure it out. 我知道有一种方法可以单独指定第一行中的操作,但我无法弄明白。
awk -v d="2017_01" 'BEGIN{FS=OFS=","} {print $0, (NR>1?d:"cmpgn_group")}' file
Following awk(a bit changed in your solution) should work for you. 关注awk(你的解决方案有点改变)应该适合你。
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
Solution 2nd: Or let's remove this $(NF+1)(
creating a new field approach) and try to directly print it. 解决方案第二:或者让我们删除这个$(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
Explanation of above command: 上述命令的说明:
awk -v d="2017_01" -F"," ' ##Setting valur of variable named d as 2017_01 and setting field separator as comma.
BEGIN{ ##Starting BEGIN section of awk here.
OFS = "," ##Setting Output field separator as comma here.
} ##Closing BEGIN block here.
{
printf("%s%s",$0,FNR>1?d RS:"cmpgn_group" RS) ##Using printf here to print the lines. So %s%s means to print 2 strings here. First I am simply printing $0(current line). Then while printing second string using condition FNR>1(when line number is greater than 1) then print variable d(which we want to add at last) with RS(to print a new line here). Else(if condition FNR>1 is not true) then it means it is very first line of Input_file and print string "cmpn_groups" with RS(record separator) whose default value is a new line.
}
' $ORIG_FILE > $NEW_FILE ##Mentioning Input_file named #ORIG_FILE and redirecting it's output to $NEW_FILE here.
using sed 使用sed
$ sed '1s/$/,\tcmpgn_group/; 2,$s/$/,\t2017_01/' file
ie for 1st line
: append ,\\tcmpgn_group
即1st line
:追加,\\tcmpgn_group
and for 2 to $
: append ,\\t2017_01
和2 to $
:追加,\\t2017_01
using awk 使用awk
$ awk -v d="2017_01" -F"," 'FNR==1{a="cmpgn_group"} FNR>1{a=d} {print $0",\t"a}' f1
Output: 输出:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.