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
相关产品推荐
相关产品推荐

