2017-10-06 60 views
1

我在處理CSV的bash腳本中使用了一些awk。 awk的做到這一點:如何使用awk添加帶有標題的新列到csv

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 

我希望新列有一個頭,讓新的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 

我知道有一種方法可以單獨指定在第一行中做什麼,但我一直無法弄清楚。

回答

1

以下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 

解決第二:還是讓我們刪除此$(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 

說明上述命令的:

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. 
+1

完美工作,謝謝。你可以在第二個解決方案中解釋''''「%s%s」'''? –

+0

@dataprincess,您的歡迎,很高興它幫助你。我也爲代碼添加了解釋,如果您有任何疑問,請告訴我。 – RavinderSingh13

3
awk -v d="2017_01" 'BEGIN{FS=OFS=","} {print $0, (NR>1?d:"cmpgn_group")}' file 
0
使用

sed的

$ sed '1s/$/,\tcmpgn_group/; 2,$s/$/,\t2017_01/' file 

即爲1st line:追加,\tcmpgn_group
和爲2 to $:使用AWK追加,\t2017_01

$ 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