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

如何在Bash脚本中为CSV添加提取后的精简版本号字段

处理CSV并添加精简版本号字段的解决方案

问题背景

原始输入CSV内容:

id,version
84544,abcd v2.1.0-something
3439,abcd a82f1a
3,abcd 2.2.1-bar

需要给输出CSV新增simple_version字段,提取规则:

  • 从version字段里去掉固定前缀abcd
  • 移除开头的单个v字符
  • 删掉短横线-及后面的构建后缀
  • 如果是6位十六进制字符串则直接保留

目标输出:

id,version,simple_version
84544,abcd v2.1.0-something,2.1.0
3439,abcd a82f1a,a82f1a
3,abcd 2.2.1-bar,2.2.1

之前的代码只能提取出精简后的内容,但没法和原CSV内容拼接:

while read line; do
    awk -F '[, ]' '{print $3}' | sed 's/^v//' | cut -d- -f-1;
done < input.csv > output.csv

可行方案

直接用awk一次性搞定所有逻辑,不用嵌套多个工具或循环,效率更高,还能完整保留原行内容并追加新字段:

awk -F ',' '
    BEGIN {OFS = ","}
    NR == 1 {print $0, "simple_version"; next}
    {
        # 复制version字段内容来处理
        temp = $2
        # 去掉开头的"abcd "前缀
        sub(/^abcd /, "", temp)
        # 移除开头的v字符
        sub(/^v/, "", temp)
        # 截断短横线及后面的内容
        sub(/-.*$/, "", temp)
        # 输出原行+新字段
        print $1, $2, temp
    }
' input.csv > output.csv

代码说明

  • -F ',':指定逗号为输入分隔符,正确拆分CSV的列
  • BEGIN {OFS = ","}:设置输出分隔符为逗号,保证输出是标准CSV格式
  • NR == 1:处理第一行表头,直接追加simple_version字段名
  • 对version字段做三次替换:先去掉固定前缀,再去v前缀,最后截掉后缀
  • 最后输出原始id、完整的version字段、处理后的simple_version

如果你偏好正则匹配提取的方式,也可以这么写:

awk -F ',' '
    BEGIN {OFS = ","}
    NR == 1 {print $0, "simple_version"; next}
    {
        # 直接匹配abcd后的目标内容(v开头或纯字符,到-为止)
        match($2, /abcd (v?[^-]+)/)
        simple = substr($2, RSTART+5, RLENGTH-5)
        # 去掉可能的v前缀
        sub(/^v/, "", simple)
        print $1, $2, simple
    }
' input.csv > output.csv

原代码的问题

原代码的while read循环只输出了提取后的内容,完全丢失了原始行的id和version信息;而且多次调用awk、sed、cut会产生多个子进程,效率低还不好维护。用awk单进程处理就能避免这些问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:26:19