awk 脚本用 if 替换值

awk 脚本用 if 替换值

我有一个管道分隔文件

d1000|1000
d1001|100
d1002|10
d1003|1
d1004|
d1005|

如果长度小于4位,我想修改$2,并保留空格不变

所以尝试通过 awk 脚本来做到这一点

BEGIN { FS="|"; OFS="\t" }

{
n=1100
{ if (length($2)!=4 && length($2)>0) {$2=++n}};

print $1, $2
}

但它一遍又一遍地打印相同的数字

d1000   1000
d1001   1101
d1002   1101
d1003   1101
d1004
d1005

而期望的输出

d1000   1000
d1001   1101
d1002   1102
d1003   1103
d1004
d1005

编辑:这是上面的代码,格式清晰gawk -o-

BEGIN {
        FS = "|"
        OFS = "\t"
}

{
        n = 1100
        if (length($2) != 4 && length($2) > 0) {
                $2 = ++n
        }
        print $1, $2
}

答案1

如果缩进更加一致,错误可能会很明显:

BEGIN { FS="|"; OFS="\t" }
{
  n=1100
  {
    if (length($2)!=4 && length($2)>0) {
      $2=++n
    }
  };
  print $1, $2
}

n对于每条记录,外部大括号内的所有内容都会无条件执行 - 因此每一行都会重置的值。

您应该将 的初始化移至nBEGIN块:

BEGIN { FS="|"; OFS="\t"; n=1100 }
{
  {
    if (length($2)!=4 && length($2)>0) {
      $2=++n
    }
  };
  print $1, $2
}

或者(更惯用的方式)

BEGIN { FS="|"; OFS="\t"; n=1100 }
(length($2)!=4 && length($2)>0) {
  $2=++n
}
{
  print $1, $2
}

答案2

我提出这个解决方案:

$ awk -F'|' -v OFS='\t' '$2 ~ /^[0-9]{1,3}$/ { $2 = 1100 +(++c) } { print $1,$2 }' file 
d1000   1000
d1001   1101
d1002   1102
d1003   1103
d1004
d1005

相关内容