我使用'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
答案 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--}
计算完成后,我们将其结果放在倒数第二个字段中。要删除最后一列,我们只是说"嘿,减少字段数量"以便最后一个被删除"。