簡體   English   中英

如何使用cat,sed,awk或cut將列添加到csv文件中的特定位置?

[英]How can I add a column to a specific position in a csv file using cat, sed, awk or 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可以通過cut -d,-f1,2,3 file1> file2列來修改文件。 但是似乎沒有選擇添加自定義列。

任何幫助將非常感激。

這是我可以用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} NR>1{k=$3; $3="\\t"; $4=k; print $0} 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
$ 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

添加白色空間來品嘗...

如果問題顯示在第一列之前確實有空間,那么我們就來濫用它:

$ 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' file
col1, col2, col3, col5
1, 1, , 1
2, 2, , 2
3, 3, , 3
4, 4, , 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM