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

时间:2016-08-05 11:09:08

标签: linux bash awk sed

我有一个包含此内容的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>列修改文件。文件2。但似乎没有添加自定义列的选项。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

这是我用$ 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"}
  • BEGIN创建一个包含更新列名称的新标头,请记住awk中的<action>块在实际处理文件之前执行
  • 对于awk中的NR>1{k=$3; $3="\t"; $4=k; print $0}部分,我k跳过原始文件中的标题,对tab-space中的第3列进行备份,覆盖它并使用空的$ 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 和第4列替换为旧的第3列值。

fedorqui在评论中提出的另一个很酷的建议,以下更简单的方法。

insert

答案 1 :(得分: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

添加白色空间......

答案 2 :(得分: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