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

If column match with value, use gsub and print value to another column

我用了一些例子:

输入:

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(=="^:^");gsub(,"*","0") && gsub(,"0","W"); else print}' file

其他列也一样。 谢谢。

像这样的事情怎么样:

awk -v OFS="\t" '{if (gsub(/G:|C:|A:|T:/, "0")) print ,,,,"W"; else print [=10=]}'

然后将从 00 开始的值替换为零。

这样怎么样:

$ 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

如果您不关心间距:

$ 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