我有一个这样的文件:
'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脚本执行此操作?
答案 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