将数值重新格式化为两个值

将数值重新格式化为两个值

我有一个巨大的文件,其中有许多列和行的数值。第 6 列之后的列中的值都是数字加上缺失的NA (012) NA

我想以这种方式更改从第 7 列开始的所有列中的值: 0更改为A A1更改为A B2更改为B BNA更改为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

相关内容