2014-10-01 165 views
1

我正在研究這個awk教程hereawk +添加列而不添加到標題

$ head file 
Name,Number,Letter 
Unix,10,A 
Linux,30,B 
Solaris,40,C 
Fedora,20,D 
Ubuntu,50,E 


這個命令插入的最後一列之後的新列。但我不想添加到標題,我該怎麼做?在此之後,我還想在後面添加標題名稱。

$ awk -F, '{$(NF+1)=++i;}1' OFS=, file 
Name,Number,Letter,1 
Unix,10,A ,2 
Linux,30,B ,3 
Solaris,40,C ,4 
Fedora,20,D ,5 
Ubuntu,50,E,6 
+0

你的輸出顯示您的輸入馬虎w.r.t尾隨空白。 – 2014-10-01 23:33:26

+0

tks,我該如何解決?啊,我看到你是指Letter列後面的空格。 – HattrickNZ 2014-10-02 00:32:22

+0

這取決於您在編輯中的選擇。我有一個程序'stb'(strip尾隨空白)的各種實現,我用它來確保沒有尾隨空白。在'vim'中,可以使用':g/[^ I] [^ I] * $/s ///'(其中'^ I'是一個製表符)來消除尾隨空格和製表符。在辦公室,當源文件中有一行尾部空白或製表符時,'vim'被設置爲顯示可怕的黃色。等等。基本上,尾隨空格和製表符是不整潔的;儘可能避免它們。 – 2014-10-02 00:55:58

回答

4

你可以跳過的第一行:

awk -F, 'NR>1{$(NF+1)=++i;}1' OFS=, file 

文件中如果可以有空格,那麼你可以使用正則表達式來掩蓋起來:

awk -F, '!/^$/ && NR>1{$(NF+1)=++i;}1' OFS=, file 

要添加一個新的標題,你可以這樣做:

awk 'NR==1{$0=$0",New_header";} NR>1{$(NF+1)=++i;}1' OFS=, file 

像@jaypal說,這可能是簡單的:

awk -F, 'NR==1{$0=$0",New_header";} NF && NR>1{$(NF+1)=++i;}1' OFS=, file 
+0

+1:你可以用'NF'忽略空行。 'awk -F,'NF && NR> 1 {$(NF + 1)= ++ i;} 1'OFS =,file'。 – 2014-10-02 00:51:41

+0

如何覆蓋現有文件,或者我只是對相同的文件名執行'>'操作? – HattrickNZ 2014-10-02 21:57:01

+1

@HattrickNZ不,這會破壞文件!如果您有最新的awk(4.1或更高版本),那麼您可以使用'-i'選項進行按步調整。否則,使用臨時文件:'awk -F,'{...}'file> tmpfile && mv tmpfile file' – 2014-10-02 22:31:40

2
$ awk 'BEGIN{FS=OFS=","} {print $0, (NR>1?NR-1:"new header")}' file 
Name,Number,Letter,new header 
Unix,10,A,1 
Linux,30,B,2 
Solaris,40,C,3 
Fedora,20,D,4 
Ubuntu,50,E,5