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

Oracle Solaris 11.4下定长文本13-30位数字掩码实现方案求助

定长文本银行账号掩码处理方案(Oracle Solaris 11.4)

问题说明

有一个定长文本文件,其中第13至30位为银行账号,需将该区间内所有字符替换为星号做掩码处理,运行环境为Oracle Solaris 11.4。

原始文本

6220750000610032002137       0000404584               MCKENNES JAITLIN C      0071000280000122
622075000079643811983        0000420000               RICHOTTA AMENDA         0071000240000134
632275079784326217002        0000340000               KOHLDECK CARA           0071000230000146
622101205691399004002904006210000610000               MEIER NICHOLAS          0071000270000222

预期输出

622075000061**********       0000404584               MCKENNES JAITLIN C      0071000280000122
622075000079*********        0000420000               RICHOTTA AMENDA         0071000240000134
632275079784*********        0000340000               KOHLDECK CARA           0071000230000146
622101205691*****************0000610000               MEIER NICHOLAS          0071000270000222

尝试的命令及报错

gawk '{if (match($0, "[0-9]", 13, 27)) $0 = substr($0, 1, 12) "*" substr($0, 27)}' PAY.EM

报错信息:

gawk: cmd. line:1: {if (match($0, "[0-9]", 13, 27)) $0 = substr($0, 1, 12) "*" substr($0, 27)}
gawk: cmd. line:1:  
                         ^ 4 is invalid as number of arguments for match

解决方法

错误原因

match函数参数格式错误,gawk的match仅支持match(string, regexp [, array])三种参数形式,传入4个参数必然报错。此外,定长文本无需正则匹配,直接按位置处理更精准高效。

最优命令

方法1:用gensub替换区间字符

gawk '{print substr($0,1,12) gensub(/./,"*","g",substr($0,13,18)) substr($0,31)}' PAY.EM
  • 逻辑:第13-30位共18个字符,先用substr($0,13,18)提取该区间,再用gensub将区间内每个字符替换为*,最后拼接前12位、星号串、31位之后的内容。

方法2:构造星号串拼接

gawk '{stars = sprintf("%18s", ""); gsub(/ /, "*", stars); print substr($0,1,12) stars substr($0,31)}' PAY.EM
  • 逻辑:先构造18个空格的字符串,再将空格替换为星号,最后拼接各部分内容完成掩码。

验证

运行上述任意命令后,输出结果将与预期完全一致,且完美适配Solaris 11.4的gawk环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:15:22