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

