如何在awk中添加值

如何在awk中添加值,awk,sh,Awk,Sh,我有一个日志大小如下的文件 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一个班轮,使其满足以下条件 将kb转换为MB(除以1000) 以MB为单位获取总数 我写了下面的awk代码,但它无法添加MB awk '{FS=" "} if ($2 ~ 'kb'){total += ($1/1000)}END{print total}' 这将把kb转换成MB并提供总计,但不会向其中添加MB值。

我有一个日志大小如下的文件

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一个班轮,使其满足以下条件

  • 将kb转换为MB(除以1000)
  • 以MB为单位获取总数
  • 我写了下面的awk代码,但它无法添加MB

    awk '{FS=" "} if ($2 ~ 'kb'){total += ($1/1000)}END{print total}'
    
    这将把kb转换成MB并提供总计,但不会向其中添加MB值。请建议

    试试看:

    $ 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
    ,则总数将由第一个字段除以1000增加。否则,它将增加第一个字段

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

    多行版本 对于喜欢将代码分散在多行的用户:

    awk '
        {
            if ($2=="kb") 
               total+=$1/1000
            else
               total+=$1
         }
    
         END{
             print total
         }' file
    
    使用三元运算符:

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

    运算符语法:

    expr?操作1:操作2

    在本例中:

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

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

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

    “kb”(实际上是kb)到MB的转换是kb除以1024。在以下知识库中,知识库假设为知识库:

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

    答案应该是6.50MB左右。不是174.03,因为MB的增加是2.20+1.10+3.15+转换后的kb(0.0020)
    $2=='kb'
    应该是
    $2=='kb'
    摇滚乐和@klashxx感谢您的关注!答案更新。这是如何工作的。你能详细说明一下,{total+=$2==“kb”?$1/1000:$1}来捕捉
    'kb'
    问题:+1。@Rock,谷歌三元操作符来查找
    https://en.wikipedia.org/wiki/%3F:
    。我无法使用超链接,因为SO编辑器切断了结尾
    !请注意,在某些情况下,在某些AWK中,未经aerentheiseized的三元表达式会导致语法错误。我会用
    total+=($2==“kb”?$1/1000:$1)
    或者更好的
    total+=$1/($2=“kb”?1000:1)
    来代替。注意:
    2='kb'
    应该是
    2=“kb”
    你确定你的乘法吗?按照惯例,“b”=字节,“b”=字节,但也不清楚您是否知道并正在故意或偶然地使用千/兆用于1000,而实际上可能是指1024的kibi/mebi。它是kB和MB0。kb应该是kb和1。将kB转换为MB是kB除以1024,而不是除以1000。这应该是真的。这是真的,直到营销人员(他们认为数字越大,销售就越容易)参与进来。现在,
    kiB=1024b
    kB=1000b
    。正如@ghoti所指出的,这是有记录的。好吧,SI万岁。这是天堂和地狱。我也在min打字机上打字。为了维护诚实和传统:+1。