代码之家  ›  专栏  ›  技术社区  ›  Dito

匹配数字以掩盖它

  •  1
  • Dito  · 技术社区  · 2 年前

    我有一个文本文件,如下所示。这是一个基于位置的文本文件。从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
    
    2 回复  |  直到 2 年前
        1
  •  4
  •   tshiono    2 年前

    正如@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
    
        2
  •  2
  •   Ed Morton    2 年前

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

    $ 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='12 17 99999' 相反

        3
  •  1
  •   jared_mamrot    2 年前

    你如何定义“最佳”?假设是固定宽度的文件格式,使用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
    
        4
  •  1
  •   ufopilot    2 年前

    使用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
    
    推荐文章