在Shell中为每个名称的文件计算值的总和

时间:2015-07-06 08:34:04

标签: shell

我有一个这样的文件:

 'left': Math.floor($(window).width() * 0.5 - (obj.group.length / 2 * this.width + this.width * 0.5))

我想通过 iphone / ipad / mac 计算总和,并输出如下:

iphonevisitor -> 125
ipadvisitor -> 200
iphonemember -> 120
ipadmember -> 100
macvisitor -> 230

A代表iphone,B代表ipad,C代表mac。

我应该如何使用Shell脚本执行此操作?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

#!/bin/bash
file="filepath"
A=($(grep -o "iphone.*" "$file" |cut -d" " -f3))
B=($(grep -o "ipad.*" "$file" |cut -d" " -f3))
C=($(grep -o "mac.*" "$file" |cut -d" " -f3))
for i in ${A[@]};do ((Asum+=i));done
for i in ${B[@]};do ((Bsum+=i));done
for i in ${C[@]};do ((Csum+=i));done
echo "A$Asum B$Bsum C$Csum"

输出:

A245 B300 C230

A,B,C是一个数组,它保存从文件中每个匹配字符串(使用cut)的第三个字段(假定空格分隔,使用grep)取得的值。

或者:

file="filepath"
A=$(grep -o "iphone.*" "$file" |cut -d" " -f3|paste -s -d+|bc)
B=$(grep -o "ipad.*" "$file" |cut -d" " -f3|paste -s -d+|bc)
C=$(grep -o "mac.*" "$file" |cut -d" " -f3|paste -s -d+|bc)
echo "A$A B$B C$C"

答案 1 :(得分:1)

您可以使用关联表将名称与输出字符匹配:

#!/bin/bash
file="filepath"

declare -A items

items[A]=iphone
items[B]=ipad
items[C]=mac

for i in "${!items[@]}";
do:
   sum=$(cat $file |grep "${items[$i]}" | cut -d ">" -f2| paste -s -d+ |bc);
   echo -n  "$i$sum "
done
echo

最后使用echo -n在同一行显示总和。

答案 2 :(得分:1)

这种工作,awk更好,如果你有awk,你可以尝试一下

<强>输入

[akshay@localhost tmp]$ cat file
iphonevisitor -> 125
ipadvisitor -> 200
iphonemember -> 120
ipadmember -> 100
macvisitor -> 230

Awk脚本

[akshay@localhost tmp]$ cat test.awk
BEGIN{
    Array["A"] = "iphone.*"
    Array["B"] = "ipad.*"
    Array["C"] = "mac.*"
}
{
    f=""
    for(i in Array)
    { 
        if($1 ~ Array[i])
        {   f = i
            break
        }
    }
}
f{
    SUM[f]+=$NF
}
END{
    for(i in Array)
        str = sprintf("%s%s%s",(str?str" ":""),i,SUM[i])
    print str
}

<强>执行

[akshay@localhost tmp]$ awk -f test.awk file
A245 B300 C230