2016-08-05 294 views
2

我有一個CSV文件與此內容:如何使用cat,sed,awk或cut將列添加到csv文件中的特定位置?

col1, col2, col5 
    1, 1, 1 
    2, 2, 2 
    3, 3, 3 
    4, 4, 4 

我需要在頭文件的第三位,但與空值添加一列。

col1, col2, col3, col4 
1, 1,  , 1 
2, 2,  , 2 
3, 3,  , 3 
4, 4,  , 4 

有什麼辦法可以用cat,sed,awk或cut之類的Linux命令來做到這一點嗎?

我知道用cut可以修改一個文件,按列-d,-f1,2,3 file1> file2。但它似乎沒有添加自定義列的選項。

任何幫助將不勝感激。

+0

@Inian謝謝。我剛剛補充說我已經嘗試過使用cut命令。但是,我找不到添加自定義列的方法。 – ebertbm

+0

您在原始文件中有一個錯字,它在第一個是'col5',後面是'col4' – Inian

回答

5

這是最好的,我可以用awk

$ awk -v FS=',' -v OFS=',' 'BEGIN{print "col1, col2, col3, col4"} NR>1{k=$3; $3="\t"; $4=k; print $0}' newfile 
col1, col2, col3, col4 
    1, 1, , 1 
    2, 2, , 2 
    3, 3, , 3 
    4, 4, , 4 

做你可以使用重定向操作符(> newfile末)

的邏輯是直接的將其寫入到一個新的文件: -

  • -v FS=',' -v OFS=','設置的輸入和輸出字段分隔符逗號(,
  • BEGIN{print "col1, col2, col3, col4"}創造與更新的列名新的頭,記得在awkBEGIN塊文件
  • 對於awk<action>部分,NR>1{k=$3; $3="\t"; $4=k; print $0}我跳過從原來的文件頭的實際處理之前進行,以備份k中的第3列,將其覆蓋並替換爲空的tab-space,並將第4列恢復爲舊的第3列值。

另一個很酷的建議fedorqui在評論中,下面更簡單的方法來做到這一點。

$ awk 'BEGIN {FS=OFS=","} NR==1{$0="col1, col2, col3, col4"} NR>1{$3=sprintf("\t,%s",$3)}1' file 
col1, col2, col3, col4 
    1, 1, , 1 
    2, 2, , 2 
    3, 3, , 3 
    4, 4, , 4 
+0

'print $ 0'是不必要的。只要說'NR> 1 {things} 1','1'就會觸發打印動作。 – fedorqui

+0

@fedorqui:謝謝你的收穫!我已經嘗試過了,我意識到我跳過了標題部分並在'{things}'中做了一些本地操作,如果我做了'{1'},它會將輸出與整個文件內容搞砸。 – Inian

+1

那麼,替換'NR == 1'跳過它並在'BEGIN'塊中打印有點奇怪。我會用'awk'BEGIN {FS = OFS =「,」} NR == 1 {$ 0 =「col1,col2,col3,col4」} NR> 1 {$ 3 = sprintf(「\ t,%s」,$ 3 )} 1'文件'而不是。請注意'sprintf'的用法根據需要進行格式化。 – fedorqui

1
$ awk -v f=3 'BEGIN{FS=OFS=","} {$f = (NR>1?"":"col"f) FS $f} 1' file 
col1,col2,col3,col4 
1,1,,1 
2,2,,2 
3,3,,3 
4,4,,4 

以上是對這個文件運行:

$ cat file 
col1,col2,col4 
1,1,1 
2,2,2 
3,3,3 
4,4,4 

添加空白的味道......

0

如果真的有空間像的問題顯示了第一列前,讓我們濫用它:

$ awk -F"(,* +)" '{for(i=j=1; ++j<NF; i++) $i=$j; $i=""} NR==1 {$3="col3"; OFS=","} 1' file 
col1,col2,col3,col5 
1,1,,1 
2,2,,2 
3,3,,3 
4,4,,4 

如果沒有:

$ awk '{$(NF+=1)=$NF; $(NF-1)=(NR==1?"col3":"")","} 1' flie 
col1, col2, col3, col5 
1, 1, , 1 
2, 2, , 2 
3, 3, , 3 
4, 4, , 4 
相關問題