我有一个这样的文件有12个字段
LINE1 CC CC CC CG CG CG CG BRE CC GG CG
LINE2 GG AA AA AA AA AA AA BRH AA GG AG
LINE3 HH HH HL LL LL LL LL BGH LL HH HL
我想分配三个变量X=$10
,y=$11
,z=$12
。然后我想要将字段2-8替换为另一个值,具体取决于我们匹配哪些变量(当将x sub与1匹配时,将y sub与2匹配时,以及将z sub与3匹配时)。注意:变量会改变每一行。
这是文件应该是什么样子
LINE1 1 1 1 3 3 3 3 BRE CC GG CG
LINE2 2 1 1 1 1 1 1 BRH AA GG AG
LINE3 2 2 3 1 1 1 1 BGH LL HH HL
这就是我试过的
awk '{x="$10; y="$11"; z="$12; gsub(/x/, "1") && gsub(/y/, "2") && gsub(/z/, "3"); print $0}'
答案 0 :(得分:2)
awk '{for(i=10;i<=12;++i){for(x=2;x<=8;++x){if($i==$x){$x=i-9}}};print}' file
编辑:这是一个使用子功能的更智能的解决方案
awk '{for(i=10;i<=12;++i){for(x=2;x<=8;++x){if($i==$x){sub($x,i-9,$x)}}};print}' file
答案 1 :(得分:1)
我相信这可以做你想要的:
$ awk '{for (i=2;i<=8;i++) $i=($i==$10)?1:($i==$11)?2:($i==$12)?3:$i; print}' file
LINE1 1 1 1 3 3 3 3 BRE CC GG CG
LINE2 2 1 1 1 1 1 1 BRH AA GG AG
LINE3 2 2 3 1 1 1 1 BGH LL HH HL
我们只想对字段2到8进行替换。因此,我们依次遍历它们:
for (i=2;i<=8;i++) $i=($i==$10)?1:($i==$11)?2:($i==$12)?3:$i
此命令循环遍历每个字段i
,从2到8,一次一个。对于每个字段,如果$i
,则$i==$10
替换为1;如果$i==$11
则替换为2,否则替换为$i==$12
,否则将其保持为$i
。
这个逻辑是用三个三元组实现的。声明。在awk
中,三元语句如下:
($i==$12)?3:$i
第一部分($i==$12)
是一个条件。如果为true,则语句返回?
之后的值。如果为false,则返回:
之后的值。因此,如果$i
等于$12
,则此语句返回值3
,否则返回$i
的值。上面的逻辑将三个这样的陈述链接在一起。
print
打印新行。