【问题标题】:subtrating the numbers in first column with awk or sed用 awk 或 sed 减去第一列中的数字
【发布时间】:2013-01-26 17:04:07
【问题描述】:

我有一个如下所示的文本文件。我想减去第一列中的数字,然后在输入文件中添加一个带有计算值(绝对值)的新列,而不是打印输出。如何使用 awk 或 sed 对多个文件执行此操作?

46-104   46   3.95073
46-46    46   1.45997
50-50    50   1.51589
52-100   52   4.16567

想要的输出

46-104   46   3.95073   58
46-46    46   1.45997   0
50-50    50   1.51589   0
52-100   52   4.16567   48

【问题讨论】:

    标签: sed awk


    【解决方案1】:

    这是使用awk的快捷方式:

    awk '{ split($1,a,"-"); print $0, (a[1]-a[2] >= 0 ? a[1]-a[2] : a[2]-a[1]) | "column -t" }' file
    

    结果:

    46-104  46  3.95073  58
    46-46   46  1.45997  0
    50-50   50  1.51589  0
    52-100  52  4.16567  48
    

    对于多个文件,假设您当前的工作目录中只有感兴趣的文件:

    for i in *; do awk '{ split($1,a,"-"); print $0, (a[1]-a[2] >= 0 ? a[1]-a[2] : a[2]-a[1]) | "column -t" }' "$i" > "$i.temp" && mv "$i.temp" "$i"; done
    

    【讨论】:

    • 谢谢!!是否可以将减去的值添加到输入文件而不是打印输出?
    • @user2013230:不用担心!不幸的是awk 不包括就地编辑文件的本地方法。要解决此问题,您需要使用mv。请查看我所做的编辑。它将适用于多个文件并应用更改。 HTH。
    【解决方案2】:

    使用 awk:

    function abs(value)
    {
        return (value<0?-value:value);
    }
    
    {
        split($1, v, "-")        
        print $0, "\t", abs(v[1]-v[2])
    }
    

    Online demo

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed 和 bc):

      sed -r 'h;s/(\S+).*/echo \1|bc/e;H;x;s/\n-?/ /' file
      
      • h将该行复制到保留空间(HS)
      • s/(\S+).*/echo \1|bc/e 在模式空间中做数学题
      • H 将换行符和答案添加到 HS 中的原始行
      • x交换PS和HS
      • s/\n-?/ / 用空格替换换行符和任何负号

      同样使用 awk:

       awk '{split($1,a,"-");b=a[1]-a[2];sub(/-/,"",b);print $0,b}' file
      

      【讨论】:

        猜你喜欢
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多