首页 > 解决方案 > 使用两列中的特定值进行 awk 替换

问题描述

我有一个看起来像这样的文件:

20:60479_C_T 60479 C T  0 0 0 0 0 1 0 1
20:60522_T_TC 60522 T TC        0 0 0 0 0 0 0 
20:60568_A_C 60568 A C  0 0 1 0 0 1 
20:60571_C_A 60571 C A  0 1 0 1 0 0 
20:60579_G_A 60579 G A  0 0 1 0 0 0 

我当前的文件更大,有 300 万行和 3,000 列。我想使用列中的值$3$4替换0其余1列中的值。所需的输出将是:

20:60479_C_T 60479 C T  C C C C C T C T
20:60522_T_TC 60522 T TC        T T T T T T T 
20:60568_A_C 60568 A C  A A C A A C 
20:60571_C_A 60571 C A  C A C A C C 
20:60579_G_A 60579 G A  G G A G G G 

我知道如何为几列做到这一点:

awk '{d["0"]=$3; d["1"]=$4; print "20", $1, "0", $2, d[$5], d[$6];}' myfile

但我不知道如何为所有列自动执行并避免手动添加所有列

标签: awk

解决方案


$ awk '{d[0]=$3; d[1]=$4; for (i=5; i<=NF; i++) $i=d[$i]} 1' file
20:60479_C_T 60479 C T C C C C C T C T
20:60522_T_TC 60522 T TC T T T T T T T
20:60568_A_C 60568 A C A A C A A C
20:60571_C_A 60571 C A C A C A C C
20:60579_G_A 60579 G A G G A G G G

推荐阅读