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
相关产品推荐
相关产品推荐

