【问题标题】:How to add values in awk如何在awk中添加值
【发布时间】:2017-01-20 06:08:22
【问题描述】:

我有一个日志大小的文件,

10.80 kb
60.08 kb
35.40 kb 
2.20 MB
1.10 MB
40.80 kb
3.15 MB
20.50 kb

我想添加 awk 一个衬里,以满足以下条件,

  1. 将 kb 转换为 MB(除以 1000)
  2. 以 MB 为单位获取总数

我写了下面的awk代码,但是添加MB失败,

awk '{FS=" "} if ($2 ~ 'kb'){total += ($1/1000)}END{print total}'

这会将 kb 转换为 MB 并提供总计,但不会向其中添加 MB 值。请建议?

【问题讨论】:

  • 注意:$2=='kb' 应该是$2=="kb"
  • 你确定你的乘法吗?按照惯例,“b”= 字节,“B”= 字节,但也不清楚您是否知道 binary multipliers 并且在您可能实际上是指 kibi/mebi 表示 1024 时故意或偶然使用公斤/兆表示 1000。
  • KB 和 MB
  • 0。 kb 应该是 kB 和 1。convert kB to MB 是 kB 除以 1024,而不是除以 1000。

标签: awk sh


【解决方案1】:

试试:

$ awk '{if ($2=="kb") total+=$1/1000; else total+=$1} END{print total}' file
6.61758

工作原理

对于每一行,都会执行if 语句:

if ($2=="kb") total+=$1/1000; else total+=$1

如果第二个字段是kb,则总和将增加第一个字段除以 1,000。否则,增加第一个字段。

代码读完文件后,打印总数。

多行版本

对于那些喜欢多行代码的人:

awk '
    {
        if ($2=="kb") 
           total+=$1/1000
        else
           total+=$1
     }

     END{
         print total
     }' file

【讨论】:

  • 答案应该在 6.50 MB 左右。不是 174.03,因为 MB 的加法是 2.20 + 1.10 + 3.15 + 转换后的 kb (0.0020)
  • $2=='kb' 应该是$2=="kb"
  • Rock 和@klashxx 感谢您的关注!答案已更新。
【解决方案2】:

使用三元运算符:

$ awk '{total+= $1 / ($2=="kb" ? 1000: 1)}END{print total}' file
6.61758

说明

运算符语法

expr ? action1 : action2

在这个例子中:

$2=="kb" ? 1000: 1

根据第二个字段值 (expr),我们的程序将执行不同的操作,在这种情况下,它返回数值 1000 (action1) 或仅返回 1 (action2)。

此时total变量用于累加$1值除以三元运算符给出的结果。

total+= $1 / ($2=="kb" ? 1000: 1)

检查this

【讨论】:

  • 这是如何工作的。您能否详细说明,{total+= $2=="kb" ? $1/1000:$1}
  • 关注'kb' 问题:+1。
  • @Rock,谷歌三元运算符,用于查找 https://en.wikipedia.org/wiki/%3F: 之类的。我无法使用超链接,因为 SO 编辑器切断了结尾 :!请注意,在某些情况下,未封装的三元表达式会在某些 awk 中导致语法错误。我会改用total+= ($2=="kb" ? $1/1000: $1) 甚至更好的total+= $1 / ($2=="kb" ? 1000: 1)
【解决方案3】:

“kb”(实际上是kB)到MB的转换是kB除以1024。下面假设kb和kB为kB:

$ awk '$2 ~ /k[bB]/ {$1/=1024} {sum+=$1} END {print "sum:" sum}' foo
sum:6.61365

【讨论】:

  • 应该是这样。直到营销人员(他们认为更大的数字更容易销售)参与进来之前都是如此。现在,kiB = 1024 BkB = 1000 B。正如@ghoti 指出的那样,这是记录在here
  • 好吧,SI 万岁。这是天堂和地狱。所以我在最小打字机上打字。
  • 坚持诚实和传统:+1。
猜你喜欢
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2014-04-04
  • 2018-05-30
  • 2019-02-21
相关资源
最近更新 更多