2016-02-19 36 views
1

我用一些例子:如果列匹配值,使用GSUB和打印值到另一列

輸入:

0.6  0.7 A:0.01 -  0 
C:0.01 0.1 -  0.2  0 
0.7  0.02 G:0.2 -  0 
0.5  0.23 0.1  T:0.05 0 
0.1  0.2 0.3  0.58 0 

所以,如果一些列有一個值開始與ACT或GI想把它更改爲 「0」 或 「 - 」 和最後一列變更爲 「W」(它是$ $ 34 $ 35 $ 36 $ 37 38)

OUTPUT:

0.6  0.7 0  -  W 
0  0.1 -  0.2  W 
0.7  0.02 0  -  W 
0.5  0.23 0.1  0  W 
0.1  0.2 0.3  0.58 0 

我想用awk。

awk '{if($34=="^:^");gsub($34,"*","0") && gsub($38,"0","W"); else print}' file 

對於其他列也是如此。 謝謝。

回答

2

這個怎麼樣:

$ awk '{for(i=1;i<=4;i++){if ($i ~ /A:|C:|T:|G:/){$i=0; $NF="W"}}}1' file | column -t 
0.6 0.7 0 -  W 
0 0.1 - 0.2 W 
0.7 0.02 0 -  W 
0.5 0.23 0.1 0  W 
0.1 0.2 0.3 0.58 0 

在一個更可讀的格式:

$ awk '{ 
      for(i=1;i<=4;i++) {   # Loop through the fieds 
      if ($i ~ /A:|C:|T:|G:/) { # If current field matches pattern 
       $i=0     # Replace it with zero 
       $NF="W"    # And make the last field a 'W' 
      } 
      } 
     }1' file | column -t 

如果你想將其限制在特定的列,可以使用數組:

awk '{c="1,3";split(c,cols,/,/);for(i in cols){if ($cols[i] ~ /A:|C:|T:|G:/){$cols[i]=0; $NF="W"}}}1' file | column -t 
1

大約是這樣的:

awk -v OFS="\t" '{if (gsub(/G:|C:|A:|T:/, "0")) print $1,$2,$3,$4,"W"; else print $0}'

,然後替換值strarting 00到零。

+0

AWK -v OFS = 「\ t」 的「{如果(GSUB(/ G | C:| A:| T:/, 「@」))打印$ 1 ,$ 2,$ 3,$ 4 $ 5, 「W」;否則打印$ 0}'erase.txt | awk'BEGIN {FS = OFS =「\ t」} {for(i = 1; i <= NF; i ++)if($ i〜/ @ /)$ i = 0}; 1' – Paul

1

如果你不在意間距:

$ awk 'gsub(/[ACGT][^[:space:]]+/,0){$NF="W"}1' file 
0.6 0.7 0 - W 
0 0.1 - 0.2 W 
0.7 0.02 0 - W 
0.5 0.23 0.1 0 W 
0.1  0.2 0.3  0.58 0 

如果這樣做:

$ awk 'gsub(/[ACGT][^[:space:]]+/,0){$NF="W"}1' file | column -t 
0.6 0.7 0 -  W 
0 0.1 - 0.2 W 
0.7 0.02 0 -  W 
0.5 0.23 0.1 0  W 
0.1 0.2 0.3 0.58 0 
相關問題