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