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

ebe*_*tbm 2 linux bash awk sed

我有一个包含此内容的csv文件:

   col1, col2, col5
    1,    1,    1
    2,    2,    2
    3,    3,    3
    4,    4,    4
Run Code Online (Sandbox Code Playgroud)

我需要在文件的第三个位置添加一个带有标题但是空值的列.

col1, col2, col3, col4
1,    1,        ,   1
2,    2,        ,   2
3,    3,        ,   3
4,    4,        ,   4
Run Code Online (Sandbox Code Playgroud)

有没有办法使用像cat,sed,awk或cut这样的Linux命令之一?

我知道有cut可以通过列cut -d,-f1,2,3 file1> file2修改文件.但似乎没有添加自定义列的选项.

任何帮助将非常感激.

Ini*_*ian 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
Run Code Online (Sandbox Code Playgroud)

您可以使用重定向运算符将其写入新文件(> newfile最后)

逻辑是直截了当的: -

  • -v FS=',' -v OFS=','将输入和输出字段分隔符设置为逗号(,)
  • BEGIN{print "col1, col2, col3, col4"}使用更新的列名创建一个新标头,记住在实际处理文件之前执行的BEGINawk
  • 对于<action>部分awk,NR>1{k=$3; $3="\t"; $4=k; print $0}我从原始文件中跳过标题,对第3列进行备份k,覆盖它并替换为空的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
Run Code Online (Sandbox Code Playgroud)