对包含数字的文件进行多次数学运算

时间:2015-09-05 10:11:41

标签: sed scripting

我使用'grep'&提取了以下数据来自文件的'sed'管道,现在我想对最后两个数字执行数学方程式,删除它们并用一个数字替换它们。

数学运算

('Experiment', 'Results (A)', 'starting')
0.00787425985436

档案数据

Add the numbers together
divide by 2
multiply by 141
ROUNDUP to whole number

因此,启动AJ29的行应显示为:

AJ29 IO_0_VRN_10 77.234 78.011
AJ30 IO_L1P_T0_100M 89.886 90.789
AJ31 IO_L1N_T0_100S 101.388 102.406
AK29 IO_L2P_T0_101M 66.163 66.828
AL29 IO_L2N_T0_101S 63.626 64.266

我可以把它放在MS excel / Open Office calc中并执行此操作但是想要避免使用MS并将其保存在单个Linux脚本中(如果可能的话)。希望你能帮忙。我到目前为止的脚本在下面,理想情况下我想添加一些管道来实现这一目标。

AJ29 IO_0_VRN_10 10945

1 个答案:

答案 0 :(得分:1)

要进行计算,请使用awk

$ awk '{$(NF-1)=sprintf("%.0f", ($(NF-1) + $NF)/2 * 141); NF--}1' file
AJ29 IO_0_VRN_10 10945
AJ30 IO_L1P_T0_100M 12738
AJ31 IO_L1N_T0_100S 14367
AK29 IO_L2P_T0_101M 9376
AL29 IO_L2N_T0_101S 9016

这会将倒数第二个字段替换为(penultimate*last)/2 * 141)的结果。为了实现这一目标,我们使用Awk printf number in width and round it up中指示的%.0f格式。

此外,在我看来,你管道太多了:我把一次打电话给grep和13打了(!)给sed。您可以改为使用sed -e 'first block' -e 'second block' ...

解释

awk中,NF表示当前行的字段数。由于$n引用了字段编号n,因此$(NF-1)引用了倒数第二个字段。

  • {...}1执行操作,然后打印生成的行。 1评估为True,任何True触发awk执行默认操作,即打印当前行。
  • $(NF-1) + $NF)/2 * 141执行计算:`(倒数第二个+最后一个)/ 2 * 141
  • {$(NF-1)=sprintf( ... )将前一次计算的结果分配给倒数第二个字段。将sprintf%.0f一起使用,我们确保执行舍入,如上所述。
  • {...; NF--}计算完成后,我们将其结果放在倒数第二个字段中。要删除最后一列,我们只是说"嘿,减少字段数量"以便最后一个被删除"。