如果列与值匹配,请使用gsub并将值打印到另一列

时间:2016-02-19 12:05:11

标签: if-statement awk gsub

我使用了一些例子:

INPUT:

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

因此,如果某列的值以A C T或G开头,我想将其更改为“0”或“ - ”,最后一列更改为“W”($ 34 $ 35 $ 36 $ 37 $ 38)

输出:

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

和其他列相同。 谢谢。

3 个答案:

答案 0 :(得分:2)

这样怎么样:

 navi.pushPage('details.html', {cancelIfRunning: true});

以更易阅读的格式:

$ 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

答案 1 :(得分:1)

这样的事情:

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

然后将值为00的值替换为零。

答案 2 :(得分: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