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

时间:2013-08-07 17:39:45

标签: 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个字段$ 2相同,或者如果该值与第3个字段$ 3相同,则我想将8个列替换为“A”。否则,该值按原样打印(某些列中预期为零值)

预期输出

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 

我尝试了以下但是它没有给我任何结果只是空行。改进我的代码对我来说比向aw +

以外的东西展示一个新的解决方案更好
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 }'

提前致谢

1 个答案:

答案 0 :(得分:2)

代码

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

或更短:

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