替换第二列和第三列的最后 4 位数字

问题描述 投票:0回答:1

我有一个文件如下:

2300
10     1112221234     111222123420231121PPPPD10+0000000850      ESIM
10     3334446789     333444678920231121PPPPD11+0000000950      RSIM
23

我希望结果如下:

2300
10     1112222345     111222234520231121PPPPD10+0000000850      ESIM
10     3334447890     333444789020231121PPPPD11+0000000950      RSIM
23

我尝试使用以下代码,并且能够替换第二列中的最后 4 位数字和第三列中日期之前的最后 4 位数字。 但它还删除了第三列中从第 11 位开始的多余空格以及字母/数字,并得到以下结果:

2300
10 1112222345 1112222345 ESIM
10 3334447890 3334447890 RSIM
23

awk '
BEGIN { FS=OFS=" " }
{if(length($2)>9 && length($3)>9)
   {$2 = substr($2,-10)
   $3 = substr($3,1,10) 
    for (i=2;i<=3;i++) {                                   
        str = substr($i, 1, length($i) - 4)                 
        for (j = length($i) - 3; j <= length($i); j++) {    
            str = str (substr($i, j, 1) + 1) % 10           
        }
        $i = str                                            
    }
}}
1' filename
linux awk replace substr
1个回答
0
投票

如果您从 $2 和 $3 列中捕获每个“感兴趣的部分”,然后递增 4 位数字,然后使用

printf
打印行,您可以获得所需的结果,例如

awk 'BEGIN {
        FS = OFS = " "
}

{
        if (length($2) > 9 && length($3) > 9) {
                col2_first_part = substr($2, 0, 6)
                col2_4_digits = substr($2, 7, 4)
                col3_first_part = substr($3, 0, 6)
                col3_4_digits = substr($3, 7, 4)
                col3_last_part = substr($3, 11, length($3) - 10)
                printf "%s\t%s", $1, col2_first_part
                for (i = 1; i <= 4; i++) {
                        printf "%s", (substr(col2_4_digits, i, 1) + 1) % 10
                }
                printf "\t%s", col3_first_part
                for (j = 1; j <= 4; j++) {
                        printf "%s", (substr(col3_4_digits, j, 1) + 1) % 10
                }
                printf "%s\t", col3_last_part
                printf "%s\n", $4
        } else {
                print
        }
}' filename
2300
10  1112222345  111222234520231121PPPPD10+0000000850    ESIM
10  3334447890  333444789020231121PPPPD11+0000000950    RSIM
23

这有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.