使用awk递增带字母前缀的字段中数字部分的方法咨询
解决方法
你之前的命令只适用于纯数字字段,当字段包含字母前缀时,awk做算术运算时会把整个字符串从首个非数字字符开始截断,字母开头的字符串转成数值的结果为0,直接加1只会得到1,自然不符合需求。
调整后的命令(通用适配任意长度非数字前缀)
awk 'match($11, /^([^0-9]+)([0-9]+)$/, arr) {$11 = arr[1] sprintf("%04d", arr[2]+1)}1' $FILE > tmp && mv tmp $FILE
命令说明
match($11, /^([^0-9]+)([0-9]+)$/, arr):对第11个字段做正则匹配,将开头的所有非数字字符(前缀)存入arr[1],末尾的数字串存入arr[2]sprintf("%04d", arr[2]+1):将提取出的数字加1后,格式化为4位长度,不足位自动补前导零- 末尾的
1是awk的固定写法,代表打印处理后的整行内容
可选简化方案(如果前缀固定为2位字符)
如果你的字段前缀固定是2位字母(比如例子里的FP),可以用更简单的子串截取方式实现:
awk '{$11 = substr($11,1,2) sprintf("%04d", substr($11,3)+1)}1' $FILE > tmp && mv tmp $FILE
额外提示
- 如果你的文件字段分隔符不是默认的空白符,需要在awk后加
-F参数指定分隔符,比如CSV文件就加-F',' - 如果你使用的是GNU awk 4.1及以上版本,可以直接用内置的原地修改功能,不需要手动处理临时文件:
awk -i inplace 'match($11, /^([^0-9]+)([0-9]+)$/, arr) {$11 = arr[1] sprintf("%04d", arr[2]+1)}1' $FILE
内容的提问来源于stack exchange,提问作者Mrbattletoad
相关产品推荐
相关产品推荐

