具有for循环的文件中的求和值

时间:2016-01-01 13:39:44

标签: bash file for-loop sum

我的文件包含KBMB中的值。如何在for循环中计算MBKB 中以MB为单位的值的总和?

对于MB,这给了我价值,然后我需要总结那些:

cat usage_1.12.2015_31.12.2015.xls.csv | grep MB | awk -F '"' '{print $4}'  | awk '{print $1}'

输出:

17
16
13
17
14
3
3
12
10
8
6
10

KB

  student@student-vm:~/Downloads$ cat usage1.12.2015_31.12.2015.xls.csv | grep KB
    "2015/12/28 14:15:46","109 KB",,0
    "2015/12/28 14:13:47","331 KB",,0
    "2015/12/21 11:01:34","762 KB",,0
    "2015/12/20 19:51:40","253 KB",,0
    "2015/12/07 07:18:50","81 KB",,0
    "2015/12/03 14:56:06","407 KB",,0

MB

student@student-vm:~/Downloads$ cat usage1.12.2015_31.12.2015.xls.csv | grep MB
"2015/12/06 15:54:47","10 MB",,0
"2015/12/06 09:43:02","4 MB",,0
"2015/12/05 21:39:04","21 MB",,0
"2015/12/05 09:17:11","18 MB",,0
"2015/12/04 21:57:49","70 MB",,0
"2015/12/04 17:09:45","1 MB",,0
"2015/12/04 16:47:05","17 MB",,0

2 个答案:

答案 0 :(得分:1)

我建议在这里使用awk:

awk -F'"?,"?' '{ split($2, a, / /); if (a[2] == "KB") a[1] /= 1000; sum += a[1] } 
END { print sum }' file

-F开关用于在逗号上分割输入,可选择用引号括起来。将空格$2上的第二个字段/ /拆分为数组a。如果第二部分a[1]a[2],则将第一部分KB(数字)除以1000。累积值的总和,一旦文件完全处理完毕,就在END块中打印该值。

答案 1 :(得分:0)

首先获取列值,以便您只有1 MB50 KB等行,然后您可以执行此类操作来获取字节数:

  1. 用空字符串替换空格(使用sed表示法):

    s/ //
    
  2. 将兆字节转换为千字节(如果使用ISO单位,则添加三个零,*1024KB并将步骤3的结果通过bc发送,如果它是kibibytes;您也可以执行此操作GB,TB等。):

    s/MB/000KB/
    
  3. 将千字节转换为字节:

    s/KB/000/
    
  4. Sum the numbers

  5. 将字节转换为兆字节:

    bc <<< "${sum} / 1000000"