【问题标题】:If column match with value, use gsub and print value to another column如果列与值匹配,则使用 gsub 并将值打印到另一列
【发布时间】:2016-02-19 12:05:10
【问题描述】:

我举个例子:

输入:

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

其他列也是如此。 谢谢。

【问题讨论】:

    标签: if-statement awk gsub


    【解决方案1】:

    这样怎么样:

    $ 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
    

    【讨论】:

      【解决方案2】:

      这样的事情怎么样:

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

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

      【讨论】:

      • awk -v OFS="\t" '{if (gsub(/G|C:|A:|T:/, "@")) 打印 $1,$2,$3,$4, $5,"W";否则打印 $0}' 擦除.txt | awk '开始 { FS = OFS = "\t" } { for(i=1; i
      【解决方案3】:

      如果你不关心间距:

      $ 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
      

      【讨论】:

        猜你喜欢
        • 2021-10-30
        • 2015-02-11
        • 2016-11-22
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 2023-03-12
        相关资源
        最近更新 更多