使用变量的if构造中的比较在awk中不起作用



我已经根据整数列对文件进行了排序,排序按预期进行

sort -t '~' -k 118 GCW_Distributor_AMS.nonpublishBkp2 > GCW_Distributor_AMS.nonpublishBkp4

我正在将已排序的文件馈送到awk命令中

awk -F'~' 'BEGIN{ OFS="34"; incr=1; startIID=100252868641; PrevIID=0 }
{ 
if(PrevIID!=$118)
{
prevIID = $118; 
$118 = startIID + incr; 
incr+=1;
} 
else if(PrevIID==$118)
{ 
$118= startIID + incr;
} 
print
}' GCW_Distributor_AMS.nonpublishBkp4 > GCW_Distributor_AMS.nonpublish

这个awk代码的预期是,如果存在重复的值,则不要增加incr变量。

示例基于IID 的排序文件

Depname   IID
cs        100
ec        200  
mec       200
ap        300

在上面的例子中,我想用1来增加IID(起始IID是1000而不是100(,这样上面的例子就变成低于

Depname   IID
cs        1001
ec        1002  
mec       1002
ap        1003

但这并没有发生,相反,文件就像低于一样

Depname   IID
cs        1001
ec        1002  
mec       1003
ap        1004

按照预期1002应该来两次。

PrevIID比较在if构造中不起作用。

我验证了输入文件的排序是否正确。

有什么想法吗?

$ cat tst.awk
BEGIN {
OFS = "t"
cnt = 1000
}
NR > 1 {
cnt += ($2 != prev)
prev = $2
$2 = cnt
}
{ print }

$ awk -f tst.awk file
Depname   IID
cs      1001
ec      1002
mec     1002
ap      1003

您的awk脚本对我来说有点太复杂了。请参阅下面的简单版本。问题可能来自1(大小写不匹配(prevIID而不是PrevIID(和2(逻辑:如果您监视的字段发生变化,比如从100到200,则递增。因此,下一行将受到影响,即使它具有相同的字段。在你的简化示例中,你会有:

incr before  incr after  printed
cs  100  1            2           cs  1001
ec  200  2            3           ec  1002
mec 200  3            3           mec 1003
ap  300  3            4           ap  1003

第二个错误只是将预期的行为移动了一行,与您所写的不同(可能是因为第一个不匹配的错误(:

cs        1001
ec        1002
mec       1003
ap        1004

为了以防万一,这里有一个更简单的脚本(带有默认的字段分隔符(,它可以与您的简化示例(没有标题行(一起使用。

awk -v startIID=1000 'BEGIN{c=startIID;p=""} $2!=p{c+=1;p=$2} {$2=c;print}'

演示:

$ cat foo.txt
cs        100
ec        200  
mec       200
ap        300
$ awk -v startIID=1000 'BEGIN{c=startIID; p=""} $2!=p{c+=1;p=$2} {$2=c;print}' foo.txt
cs 1001
ec 1002
mec 1002
ap 1003

最新更新