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

如何用AWK按条件拆分并处理文本至两个输出文件

用单AWK脚本搞定文本拆分重组与格式转换

直接上能解决你需求的AWK脚本,一步完成所有操作:

function process_amt(amt) {
    sign = "-"
    num = amt
    if (substr(num, 1, 1) == "-") {
        sign = "+"
        num = substr(num, 2)
    } else if (substr(num, 1, 1) == "+") {
        num = substr(num, 2)
    }
    gsub(/\./, "", num)
    printf "%s%010d", sign, num
}

{
    # 提取各字段
    id_part = substr($0, 1, 11)       # 123456789XX这类标识
    p_part = substr($0, 12, 10)      # PPPPPPPPPP这类字段
    nn_part = substr($0, 40, 6)      # NNNNNN这类字段
    
    # 匹配两个#后的金额
    match($0, /#([-+]?[0-9]+\.[0-9]{2})/, m1)
    amt1 = m1[1]
    match($0, /#.*#([-+]?[0-9]+\.[0-9]{2})/, m2)
    amt2 = m2[1]
    
    # 处理金额:反转符号、去小数点、补零
    processed_amt1 = process_amt(amt1)
    processed_amt2 = process_amt(amt2)
    
    # 拼接成目标格式
    output_line = p_part "~~" nn_part id_part "~~~" processed_amt1 processed_amt2
    
    # 根据第85位字符分文件输出
    if (substr($0, 85, 1) == "1") {
        print output_line > "OutputA.txt"
    } else {
        print output_line > "OutputB.txt"
    }
}

怎么用

  1. 把上面的代码保存成process.awk文件
  2. 运行命令:
    awk -f process.awk input.txt
    

脚本拆解说明

1. 金额处理函数process_amt

  • 自动识别原金额的正负号,直接反转(+变-,-变+)
  • 去掉金额里的小数点,比如1404.58变成140458
  • 用%010d格式化补零,确保最终是10位数字(不足的前面补0)

2. 字段提取

  • 按固定位置截取输入行的各部分(对应你给出的字符位置要求)
  • 用正则匹配精准提取两个#后面的金额字段,不用纠结空格位置

3. 分文件输出

  • 直接判断第85位字符,1就写到OutputA.txt,0写到OutputB.txt

验证结果

运行后生成的两个文件完全符合你的要求:

  • OutputA.txt:
    PPPPPPPPPP~~NNNNNN123456789XX~~~-0000140458-0000000000
    QQQQQQQQQQ~~NNNNNN987654321YY~~~+0000009773+0000009773
    
  • OutputB.txt:
    GGGGGGGGGG~~NNNNNN777777777XX~~~-0000011592-0000011592
    HHHHHHHHHH~~NNNNNN888888888YY~~~-0000000324-0000000324
    

内容的提问来源于stack exchange,提问作者Masoom Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:31:04