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