【问题标题】:math in awk columnsawk 列中的数学
【发布时间】:2016-10-17 19:23:58
【问题描述】:

我正在尝试执行以下 awk 命令

 awk '{ if($3-$2 >= 1000) print $1"\t"$3-1000"\t"$3"\t"$4"\t"$5 ; else if($3-$2 < 1000) print $1"\t"$3-($3-$2/2)"\t"$3"\t"$4"\t"$5 }'file

如果第 3 列和第 2 列之间的减法 > 1000 则遵循某个条件,否则遵循另一个条件,其中第 2 列是 column3-(column3-column2/2) 整数。该文件如下所示:

  chrX  99885864    99887481    I7  -
  chrX  99887566    99888401    I6  -
  chrX  99888537    99888927    I5  -
  chrX  99889027    99890174    I4  -
  chrX  99890250    99890554    I3  -
  chrX  99890744    99891187    I2  -
  chrX  99892102    99894941    I1  -
 chr20  49552800    49557401    I8  -
 chr20  49557493    49557641    I7  -
 chr20  49557747    49558567    I6  -

【问题讨论】:

  • 你遇到了什么错误?
  • 我得到类似:chrX 4.99443e+07 99888927 I5 或 chr20 2.47787e+07 49557641 I7 而不是整数
  • 检查this post。看起来你不想要print 默认为的科学记数法

标签: awk calculated-columns subtraction


【解决方案1】:

您需要覆盖awk 默认值或显式格式化。

$ awk -v OFS='\t' '{$2=sprintf("%d",$3-(($3-$2>=1000)?1000:$2/2))}1' file

chrX    99886481        99887481        I7      -
chrX    49944618        99888401        I6      -
chrX    49944658        99888927        I5      -
chrX    99889174        99890174        I4      -
chrX    49945429        99890554        I3      -
chrX    49945815        99891187        I2      -
chrX    99893941        99894941        I1      -
chr20   49556401        49557401        I8      -
chr20   24778894        49557641        I7      -
chr20   24779693        49558567        I6      -

ps。我认为您的公式对于 else 条件不正确,否则请在我的脚本中进行更改。

【讨论】:

  • 嗨 karakfa 非常感谢,我应该更具体一些,它是 column3-(column3-column2/2) 这样而不是 49944618 它将是 99888401-99887566=835 并将其除以 2将给出 417.5,我从 99888401 中减去 417 得到 99887984。我只是不知道如何在这个 ?: 子句中添加除法。
  • $3-($3-$2/2) = $2/2 你是说$3-($3-$2)/2 吗?如果是这样,请将脚本中的 $2/2 替换为 ($3-$2)/2
  • 哦,是的,对不起,我把自己弄糊涂了,当它如此明显时,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2021-08-01
  • 2019-07-06
  • 1970-01-01
  • 2011-09-04
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多