Awk

將數值重新格式化為兩個值

  • September 30, 2022

我有一個巨大的文件,其中包含許多列和行中的數值。第 6 列之後的列中的值都是數字加上缺少NA (01或)。2``NA

我想以這種方式更改第 7 列及以後所有列中的值: 0to A A1to A B2toB BNAto 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   

有點長,但直截了當:

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

引用自:https://unix.stackexchange.com/questions/719321