如何用sed实现文件前两列最后四位数字的循环加1替换?
批量处理CSV列末尾四位数字循环加1
需求说明
现有如下格式的CSV文件:
ID,SEQ,PO_NUM,BATCH,CREATE_DT 99001100788259,127856626,111,20230801 99001100788270,223412976,111,20230801 99001100788281,112120972,222,20230801
需要实现:每行前两列的最后四位数字按规则替换——每位数字加1,9变为0(0→1、1→2…8→9、9→0),最终期望结果:
99001100789360,127857737,111,20230801 99001100789381,223413087,111,20230801 99001100789392,112121083,222,20230801
解决方案:用awk实现
sed擅长简单字符替换,但这种需要逐字符做数值计算的场景,awk更合适。直接用下面的awk命令处理文件(假设文件名为data.csv):
awk -F ',' ' NR==1 {print; next} function process_str(s) { prefix = substr(s, 1, length(s)-4) suffix = substr(s, length(s)-3) new_suffix = "" for(i=1; i<=4; i++) { c = substr(suffix, i, 1) new_c = (c + 1) % 10 new_suffix = new_suffix new_c } return prefix new_suffix } { $1 = process_str($1) $2 = process_str($2) print $1 "," $2 "," $3 "," $4 "," $5 }' data.csv
命令解释
-F ',':指定CSV的分隔符为逗号NR==1 {print; next}:第一行是表头,直接输出后跳过后续处理- 自定义函数
process_str(s):处理单个字段的逻辑prefix = substr(s, 1, length(s)-4):提取字段除最后四位外的前缀部分suffix = substr(s, length(s)-3):提取最后四位数字- 循环遍历四位数字的每一位,计算
(数字+1)%10(自动实现9→0的循环),拼接成新的后缀 - 返回前缀+新后缀的结果
- 主逻辑:调用函数处理第1、2列,然后按CSV格式拼接所有字段输出
运行结果
执行命令后,输出就会和你期望的结果完全一致。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

