我有一个文件如下:
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
如果您从 $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
这有帮助吗?