计算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”文件就足够了。