Awk 将字段替换为同一行中其他字段的值

Awk 将字段替换为同一行中其他字段的值,awk,gawk,nawk,Awk,Gawk,Nawk,我有这样的意见: rs10000004 C T 4 rs10000004 0 75625312 C C C C T 0 C T rs10000005 G A 4 rs10000005 0 75625355 G 0 A A A G A A 如果列中的值与第二个字段$2相同,我想用“A”替换从8到结尾的列,如果值与第三个字段$3相同,则用“B”替换。否则,将按原样打印该值(某些列中应为零值) 预期产量 rs10000004 C T 4 rs10000004 0 75625312 A A A A

我有这样的意见:

rs10000004 C T 4 rs10000004 0 75625312 C C C C T 0 C T 
rs10000005 G A 4 rs10000005 0 75625355 G 0 A A A G A A 
如果列中的值与第二个字段$2相同,我想用“A”替换从8到结尾的列,如果值与第三个字段$3相同,则用“B”替换。否则,将按原样打印该值(某些列中应为零值)

预期产量

rs10000004 C T 4 rs10000004 0 75625312 A A A A B 0 A B 
rs10000005 G A 4 rs10000005 0 75625355 A 0 B B B A B B 
我尝试了下面的方法,但它没有给我任何结果,只是空行。对我来说,改进代码比使用awk以外的东西向我展示新的解决方案更好

cat input | awk '{ for(i=8; i<=NF; i++) { if($i == $2) $i="A"; else if($i == $3) $i="B"; else $i == 0; } print $i }'

cat输入| awk'{for(i=8;icode

awk '
{
    for (i=8; i<=NF; i++) {
       if ($i == $2) {
           $i = "A";
       }
       else {
           if ($i == $3) {
               $i = "B";
           }
           else {
               $i = 0;
           }
       }
    }
    print;        
}' input

将循环更改为从
i=8
开始,并删除if语句。好吧,这样它就可以工作了,但我犯了一个错误,您可能也犯了这个错误,它在最后一个else{$i=0}之后,而不是$i==0对吗?使用三元运算符:
awk'{for(i=8;i)它可以更短
awk '
{
    for (i=8; i<=NF; i++) {
       if ($i == $2)
           $i="A";
       else
           if ($i == $3)
               $i="B";
           else
               $i = 0;
    }
}
1' input
rs10000004 C T 4 rs10000004 0 75625312 A A A A B 0 A B 
rs10000005 G A 4 rs10000005 0 75625355 A 0 B B B A B B