Linux系统中如何在CSV文件的指定列前插入新列
Linux下在CSV指定列前插入新列的实现方法
以下方法均在Linux环境下验证可用,根据实际场景选择即可:
方法一:awk(系统自带,无依赖,最常用)
该方法无需安装额外软件,适合绝大多数简单CSV场景,支持自定义分隔符、插入值。
针对你给出的示例(多空格分隔、在C列也就是第3列前插入F列),直接执行以下命令即可:
awk 'BEGIN{OFS=" "} NR==1 {print $1,$2,"F",$3,$4,$5} NR==2 {print $1,$2,"V66",$3,$4,$5} NR==3 {print $1,$2,"V34",$3,$4,$5} ' test.csv > res.csv
执行完生成的res.csv内容和你给出的目标格式完全一致。
参数说明:
BEGIN{OFS=" "}:设置输出列之间的分隔符为三个空格,和示例的对齐格式匹配;如果是标准逗号分隔CSV,改成BEGIN{FS=",";OFS=","}即可NR==x:对应第x行的处理逻辑,表头行(第1行)插入列名F,后续数据行插入你需要的对应值即可,有多少行数据就加多少行对应规则- 如果原文件列数不固定,要在第3列前插入固定值,可以用通用写法,不用手动列所有列:
# 逗号分隔CSV通用版,任意列数都能在第3列前插入固定内容"new_col_val" awk -F ',' 'BEGIN{OFS=","}{ res="" for(i=1;i<=2;i++) res=res $i OFS res=res "new_col_val" OFS for(i=3;i<=NF;i++) res=res $i (i==NF?"":OFS) print res }' test.csv > res.csv
方法二:paste+cut(适合新列内容已提前准备为单列文件的场景)
如果你要插入的F列内容已经提前存成了单列文件f_col.txt(第一行是F,第二行是V66,第三行是V34,和原文件行数一一对应),直接用系统自带的paste和cut命令拼接就行,逗号分隔CSV的命令如下:
paste -d ',' \ <(cut -d ',' -f1-2 test.csv) \ f_col.txt \ <(cut -d ',' -f3- test.csv) \ > res.csv
该方法逻辑非常直观:把原文件切成「前2列」「第3列到最后」两部分,中间夹上提前准备好的新列文件,直接拼接就是结果。
方法三:csvkit(适合带转义、引号的复杂标准CSV)
如果你的CSV内容里包含带逗号的字段、引号包裹的内容,用前两种方法可能会拆分错列,推荐先安装csvkit工具处理:
# Debian/Ubuntu系安装 sudo apt install csvkit # RHEL/CentOS系安装 sudo yum install csvkit
安装完后可结合paste方法处理,csvkit会自动识别特殊字符转义,不会拆错列。
注意事项
- 操作前建议先备份原文件,避免命令写错损坏原始数据
- 处理完可以用
cat res.csv或者column -t res.csv(自动对齐列)检查结果是否符合预期
内容的提问来源于stack exchange,提问作者Daffy
相关产品推荐
相关产品推荐

