计算Shell中每个名称的文件值之和

计算Shell中每个名称的文件值之和,shell,Shell,我有这样一个文件: iphonevisitor -> 125 ipadvisitor -> 200 iphonemember -> 120 ipadmember -> 100 macvisitor -> 230 A245 B300 C230 我想通过iphone/ipad/mac来计算总和,并按如下方式输出: iphonevisitor -> 125 ipadvisitor -> 200 iphonemember -> 120 ipadmemb

我有这样一个文件:

iphonevisitor -> 125
ipadvisitor -> 200
iphonemember -> 120
ipadmember -> 100
macvisitor -> 230
A245 B300 C230
我想通过iphone/ipad/mac来计算总和,并按如下方式输出:

iphonevisitor -> 125
ipadvisitor -> 200
iphonemember -> 120
ipadmember -> 100
macvisitor -> 230
A245 B300 C230
A代表iphone,B代表ipad,C代表mac

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

您可以执行以下操作:

#!/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是保存从文件中每个匹配字符串(使用
grep
)的第三个字段(假定空格分隔,使用
cut
)中获取的值的数组

或:


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

#!/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在同一行中显示总和。

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

输入

[akshay@localhost tmp]$ cat file
iphonevisitor -> 125
ipadvisitor -> 200
iphonemember -> 120
ipadmember -> 100
macvisitor -> 230
[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
}
Awk脚本

[akshay@localhost tmp]$ cat file
iphonevisitor -> 125
ipadvisitor -> 200
iphonemember -> 120
ipadmember -> 100
macvisitor -> 230
[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

这是非常基本的,因此最好展示您的一些尝试。
cat文件grep
cat
的无用使用<代码>grep“pattern”文件就足够了。