unix 匹配号码来掩盖它

sg3maiej  于 2023-08-04  发布在  Unix
关注(0)|答案(4)|浏览(108)

我有一个类似于下面的文本文件。这是一个基于位置的文本文件。从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

yc0p9oo0

yc0p9oo01#

正如@jared_mamrot评论的那样,定义“最好”可能很困难。以下是一个符合posix的解决方案,仅供参考:

awk '{s = substr($0, 13, 17); gsub(/[0-9]/, "*", s); print(substr($0, 1, 12) s substr($0, 30))}' PAY.EM

字符串
测试结果:

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

vfwfrxfs

vfwfrxfs2#

使用GNU awk(我在你的错误消息中看到,比如你已经在使用的gawk: cmd. line:1: ...):

$ gawk -v FIELDWIDTHS='12 17 *' -v OFS= '{gsub(/[0-9]/,"*",$2); print}' file
622075000061**********       0000404584               MCKENNES JAITLIN C      0071000280000122
622075000079*********        0000420000               RICHOTTA AMENDA         0071000240000134
632275079784*********        0000340000               KOHLDECK CARA           0071000230000146
622101205691*****************0000610000               MEIER NICHOLAS          0071000270000222

字符串
如果你有一个旧版本的gawk,它不支持*作为FIELDWIDTHS的最后一部分来读取该行的其余部分,那么使用FIELDWIDTHS='12 17 99999'

nlejzf6q

nlejzf6q3#

你如何定义“最好”?假设文件格式是固定宽度的,使用GNU AWK(不是posix)的一个可能选项是:

awk 'BEGIN {
    FIELDWIDTHS = "29 26 25 17"
}

{
    a = substr($1, 1, 12)
    b = substr($1, 13, 30)
    gsub("[[:digit:]]", "*", b)
    print a b $2 $3 $4
}' test.txt
622075000061**********       0000404584               MCKENNES JAITLIN C      0071000280000122
622075000079*********        0000420000               RICHOTTA AMENDA         0071000240000134
632275079784*********        0000340000               KOHLDECK CARA           0071000230000146
622101205691*****************0000610000               MEIER NICHOLAS          0071000270000222

字符串

1sbrub3j

1sbrub3j4#

使用GNU awk

$ awk -v from=13 -v to=30 -v mask="*" '
    BEGIN{FS=OFS=""}
    {
     for(i=from;i<to;i++) $i=($i==" " ? $i : mask)
    }1
' file 
622075000061**********       0000404584               MCKENNES JAITLIN C      0071000280000122
622075000079*********        0000420000               RICHOTTA AMENDA         0071000240000134
632275079784*********        0000340000               KOHLDECK CARA           0071000230000146
622101205691*****************0000610000               MEIER NICHOLAS          0071000270000222

字符串

相关问题