我有一个管道分隔文件
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
对于每条记录,外部大括号内的所有内容都会无条件执行 - 因此每一行都会重置的值。
您应该将 的初始化移至n
该BEGIN
块:
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