如何用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" } }
怎么用
- 把上面的代码保存成
process.awk文件 - 运行命令:
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
相关产品推荐
相关产品推荐

