AWK文本处理:第2、3列数字不匹配时替换第2列对应日期
固定列数字匹配替换日期AWK方案
核心逻辑适配1-4位长度可变数字的比对场景,自动消除前导0影响,无需硬编码字符切割位置,避免列错位:
- 提取第2列的业务数字:剔除前3位固定前导0、剔除末尾6位日期段,转数值自动去除多余前导0
- 提取第3列的对应业务数字:截取第3列开头到第一个非数字字符(横杠)前的数字段,同样转数值消前导0
- 两个数字不相等时,把第2列末尾6位的日期替换为目标值,默认值为220102,支持传入自定义日期参数,可直接对接现有日期输入脚本
- 输出保留原列对齐格式,和原始文件排版一致
完整脚本代码
BEGIN{ # 未传入自定义日期时默认用220102 if (!date) date = "220102" } { col2 = $2 col3 = $3 # 提取第2列待比对数字 num2 = substr(col2, 4, length(col2)-9) + 0 # 提取第3列待比对数字 split(col3, tmp_seg, /[^0-9]/) num3 = tmp_seg[1] + 0 # 数字不匹配则替换末尾6位日期 if (num2 != num3) { col2 = substr(col2, 1, length(col2)-6) date } # 按原排版对齐输出 printf "%-20s%-20s%s\n", $1, col2, col3 }
使用方法
- 使用默认日期220102处理文件:
awk -f 脚本文件名.awk 待处理数据文件.txt - 对接自定义日期输入时,通过
-v参数传入日期值即可:awk -v date="传入的6位日期值" -f 脚本文件名.awk 待处理数据文件.txt
用提供的样例数据运行该脚本,输出结果和给出的预期结果完全一致,自动识别所有数字不匹配的行替换日期,匹配的行保留原始日期不变。
内容的提问来源于stack exchange,提问作者fletching
相关产品推荐
相关产品推荐

