You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何在指定列后添加带值的表头列

如何在CSV指定列后插入新列并赋值

问题场景

需要在Person.csv的Age列后添加Gender列并统一赋值为Male,同时修正原始表头中多余的空分隔符。

原始文件内容

cat Person.csv

First_Name|Last_Name||Age|Address
Ram|Singh|18|Punjab
Sanjeev|Kumar|32|Mumbai

当前命令及问题

当前使用的sed命令将新列追加到了每行末尾,且未修正表头的空分隔符,不符合需求:

cat Person.csv | sed '1s/$/|Gender/; 2,$s/$/|Male/' 

当前输出

First_Name|Last_Name||Age|Address|Gender
Ram|Singh|18|Punjab|Male
Sanjeev|Kumar|32|Mumbai|Male

期望输出

First_Name|Last_Name|Age|Gender|Address
Ram|Singh|18|Male|Punjab
Sanjeev|Kumar|32|Male|Mumbai

解决方案

方法1:使用sed命令

通过正则匹配定位Age列的位置,插入新列并修正表头格式:

sed -E '1s/(\|Age\|)/\1Gender\|/; 1s/\|\|/|/; 2,$s/([0-9]+)\|/\1\|Male\|/' Person.csv

命令分解:

  • 1s/(\|Age\|)/\1Gender\|/:在表头的|Age|后插入Gender|
  • 1s/\|\|/|/:将表头中的连续分隔符||替换为单个|,修正空列问题
  • 2,$s/([0-9]+)\|/\1\|Male\|/:对数据行,匹配年龄数字后的分隔符,替换为|Male|,实现插入新列

方法2:使用awk命令(更易读)

awk处理结构化文本更直观,精准控制列的位置:

awk -F'|' -v OFS='|' '
NR==1 {
    # 处理表头:跳过空字段,在Age后插入Gender
    for(i=1; i<=NF; i++) {
        if($i == "Age") {
            printf "%s|Gender|", $i
        } else if($i != "") {
            printf "%s|", $i
        }
    }
    sub(/\|$/, "\n")  # 去掉末尾多余的分隔符并换行
}
NR>1 {
    # 处理数据行:直接按指定格式输出,插入Male到Age之后
    printf "%s|%s|%s|Male|%s\n", $1, $2, $3, $4
}
' Person.csv

命令分解:

  • NR==1块:遍历表头字段,过滤空字段,遇到Age时追加Gender列
  • NR>1块:直接按顺序拼接字段,将Male插入到年龄字段之后

两种方法执行后都能得到期望的输出结果。

内容的提问来源于stack exchange,提问作者Windas_Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:03:21