【问题标题】:Divide each column by another column将每一列除以另一列
【发布时间】:2020-12-14 02:33:23
【问题描述】:

我有

V1           V2      V3      V4            sites  var_homorefref  var_homodevdev  var_hetdevdev  var_hetrefdev
NC_044998.1  14582   80739   LOC100221041  596    1256            156             7              319
NC_044998.1  31388   68748   DCBLD2        338    617             88              4              171
NC_044998.1  80874   299341  CMSS1         2873   6246            1183            51             2024
NC_044998.1  112495  297570  FILIP1L       2434   5388            996             31             1736
NC_044998.1  287349  289742  LOC116808959  14     49              0               0              6
NC_044998.1  300404  343805  TBC1D23       364    909             158             3              305
NC_044998.1  333622  344667  NIT2          84     163             44              0              57
NC_044998.1  346168  368957  TOMM70        177    361             85              0              159
NC_044998.1  371654  380427  LNP1          116    308             66              6              126

我想将$6-$9 除以$5*11

我在努力

awk 'BEGIN {FS=OFS="\t"} FNR>1 {for(i=6; i<=9; i++) print $1 OFS $2 OFS $3 OFS $4 OFS $5 OFS ($5?$i/($5*11):"0")}' file

但它只计算$6

它也不会输出$i 中的字段为0 的行,而不是输出“0”并保持总行数。

【问题讨论】:

  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 这是您的第 52 个问题 - 您现在真的应该知道在您的问题中包含带有示例输入、预期输出和代码的 minimal reproducible example,而无需再次被告知。如果没有,请再次查看How to Ask....

标签: awk


【解决方案1】:

您可以使用这个awk 脚本:

awk 'BEGIN {FS=OFS="\t"} NR>1 && $5!=0 {for (i=6; i<=9; ++i) $i /= ($5*11)} 1' file | column -t


V1           V2      V3      V4            sites  var_homorefref  var_homodevdev  var_hetdevdev  var_hetrefdev
NC_044998.1  14582   80739   LOC100221041  596    0.19158         0.023795        0.00106772     0.0486577
NC_044998.1  31388   68748   DCBLD2        338    0.165949        0.0236686       0.00107585     0.0459925
NC_044998.1  80874   299341  CMSS1         2873   0.197639        0.0374332       0.00161377     0.0640446
NC_044998.1  112495  297570  FILIP1L       2434   0.20124         0.0372003       0.00115784     0.064839
NC_044998.1  287349  289742  LOC116808959  14     0.318182        0               0              0.038961
NC_044998.1  300404  343805  TBC1D23       364    0.227023        0.0394605       0.000749251    0.0761738
NC_044998.1  333622  344667  NIT2          84     0.176407        0.047619        0              0.0616883
NC_044998.1  346168  368957  TOMM70        177    0.185413        0.0436569       0              0.0816641
NC_044998.1  371654  380427  LNP1          116    0.241379        0.0517241       0.00470219     0.0987461

【讨论】:

    【解决方案2】:

    它也不会输出 $i 中的字段为 0 的行,而不是 输出“0”并保持总行数。

    我相信这是因为您的 Input_file 不是制表符分隔的(至少显示了示例)。为了看到这一点,让我们对您的示例运行一次。

    awk 'BEGIN{FS="\t"} FNR>1{print "First field.." $1}' Input_file
    First field..NC_044998.1  14582   80739   LOC100221041  596    1256            156             7              319
    

    你可以看到我们用整行代替了第一个字段,所以我们不需要使用 BEGIN{FS="\t"} 直到/除非 Input_file 真的是 TAB 分隔的。



    请您尝试关注一次。这是按照$i/($5*11) 的逻辑将字段 6 到 9 的值保存并保存在当前字段本身中,这样只会打印 1 行。

    awk '
    FNR>1{
      for(i=6; i<=9; i++){
        $i=($5!="" && $5?($i/($5*11)):"0")
      }
    }
    1' Input_file | column -t
    

    或者,如果您想在单独的行上打印整行(第 1 到第 5 字段)以及(第 6 到第 9 字段),请尝试以下操作。

    awk '
    FNR>1{
      for(i=6; i<=9; i++){
        print $1 OFS $2 OFS $3 OFS $4 OFS $5 OFS ($5!="" && $5?($i/($5*11)):"0")
      }
    }' Input_file
    

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2017-03-31
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多