我有一个包含此内容的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。但似乎没有添加自定义列的选项。
非常感谢任何帮助。
答案 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