【问题标题】:Multiple mathematical operations on a file containing numbers对包含数字的文件进行多项数学运算
【发布时间】:2015-12-01 10:16:31
【问题描述】:

我使用“grep”和“sed”管道从文件中提取了以下数据,现在我想对最后两个数字执行数学方程式,删除它们并用单个数字替换它们。

数学运算

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

文件数据

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

所以以 AJ29 开头的行应该显示为:

AJ29 IO_0_VRN_10 10945

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

grep IOB xc7vx690tffg1930.pkg | sed 's/pin//g' | sed 's/IOB_[A-Za-z0-9]*//g' | sed 's/ /-/g' | sed 's/\t//g' | sed 's/^[-]*//g' | sed 's/-/ /g' | sed 's/ [0-9][0-9] //g' | sed 's/[[:space:]]\+/,/g' | sed 's/,X[0-9A-Z]*,//g' | sed 's/,[0-9]*[A-Z],//g' | sed 's/N\.A\.,/,/g' | sed 's/,$//g' | sed 's/,/ /g'

【问题讨论】:

    标签: sed scripting


    【解决方案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) 的结果。为了使其圆整,我们使用%.0f 格式,如Awk printf number in width and round it up 所示。

    另外,在我看来,您的管道太多了:我数了一次调用 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--} 计算完成后,我们会在倒数第二个字段中得到结果。要删除最后一列,我们只需说“嘿,减少字段数”,这样最后一列就会被“删除”。

    【讨论】:

    • 这看起来很完美,我会试一试 - 谢谢。包含大量信息。
    • 这看起来很完美,我会试一试 - 谢谢@fedorqui 我不是一个有经验的 Linux 用户,我确实认为我做了很多管道,但原始文件格式非常复杂,而且包含很多我不想要的信息,这是我能找到的唯一方法。我确信有一个更简单的方法。原始格式:pin IOB_X0Y49 AJ29 10 10 IO_0_VRN_10 X51Y49 N.A. 77.234 78.011
    • @Ad0m 很高兴阅读答案对您有用。如果它解决了您的问题,请考虑接受它。关于管道的数量:如果您想浏览内容,请考虑编辑问题,但要显示具有代表性的输入以及所需的输出。
    • 只是为了让您知道@fedorqui 我只是在另一个管道之后插入了您的答案(哈哈),并且效果很好。我不明白,所以将阅读有关 awk 但完美的欢呼。我已经按照您的建议卸下了管道并将它们放入(不知道您可以这样做,所以再次感谢)。我还在学习……祝你一切顺利,干杯
    • @Ad0m 好话:) 我刚刚编辑了我的答案,解释了awk 的工作原理。稍微玩一下,你会发现使用awk 是多么的酷!干杯!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多