我有一个巨大的文件,其中有许多列和行的数值。第 6 列之后的列中的值都是数字加上缺失的NA
(0
或1
或2
) NA
。
我想以这种方式更改从第 7 列开始的所有列中的值: 0
更改为A A
、1
更改为A B
、2
更改为B B
和NA
更改为0 0
。这样,从第 7 列开始的标题将分别出现两次。我可以使用 来执行此操作吗awk
?我的输入文件是这样的,但之后有很多列。我的输出文件应该是制表符分隔的。
id1 id2 parental maternal sex phenotype A_101 A_102 A_103
20907153 20907153 0 0 -9 -9 1 0 0 0 0 0
31405729 31405729 0 0 -9 -9 0 0 0 0 0 0
31450731 31450731 0 0 -9 -9 0 0 0 2 0 0
41940308 41940308 0 0 -9 -9 0 0 0 NA 0 0
52428081 52428081 0 0 -9 -9 0 0 0 0 0 0
41943104 41943104 0 0 -9 -9 0 0 0 0 0 0
答案1
有点长,但很简单:
awk '{ for (i=7; i<=NF; i++) { if ($i=="0"){ sub(0,"A A",$i) } else if ($i=="1"){ sub(1,"A B",$i) } else if ($i=="2") {sub(2,"B B",$i) } else if ($i=="NA") { sub("NA","0 0",$i) }} print $0}' inputfile.txt
如果字段编号 >= 7,则循环遍历每个字段,如果符合您的条件之一,则将该字段替换为相应的对。循环后打印整行。
对我来说这返回:
id1 id2 parental maternal sex phenotype A_101 A_102 A_103
20907153 20907153 0 0 -9 -9 A B A A A A A A A A A A
31405729 31405729 0 0 -9 -9 A A A A A A A A A A A A
31450731 31450731 0 0 -9 -9 A A A A A A B B A A A A
41940308 41940308 0 0 -9 -9 A A A A A A 0 0 A A A A
52428081 52428081 0 0 -9 -9 A A A A A A A A A A A A
41943104 41943104 0 0 -9 -9 A A A A A A A A A A A A