我有多个文件,让我们说
fname1
包含:
red=5
green=10
yellow=2
fname2
包含:
red=10
green=2
yellow=2
fname3
包含:
red=1
green=7
yellow=4
我想编写从这些文件中读取的脚本,将每种颜色的数字相加, 并将总和重定向到新文件。
新文件包含:
red=16
green=19
yellow=8
答案 0 :(得分:3)
[ awk ]是你的朋友:
awk 'BEGIN{FS="=";}
{color[$1]+=$2}
END{
for(var in color)
printf "%s=%s\n",var,color[var]
}' fname1 fname2 fname3 >result
应该这样做。
揭开上述神秘面纱
''
内包含的任何内容都是awk程序。BEGIN
内的资料只会执行一次,即在开头=
表示awk将使用=
来分隔字段/列。awk
会将每一行视为记录。=
作为分隔符。{color[$1]+=$2}
创建(如果尚不存在)关联数组,其颜色名称为key
,+=
将field2的value
添加到此数组元素。请记住,创建时的关联数组会被初始化为零。END{}
内的任何内容都将仅在最后执行,即在退出之前执行。for(var in color)
是用于解析关联数组的forloop样式。var
将是key
和color[key]
指向的值。printf "%s=%s\n",var,color[var]
是自我解释的。注意强>
fname
开头,您甚至可以fname*
代替fname1 fname2 fname3
答案 1 :(得分:0)
因为您的源文件是有效的shell代码。您可以直接获取它们(如果它们来自可靠来源)并使用Shell Arithmetic累积它们。
#!/bin/bash
sum_red=0
sum_green=0
sum_yellow=0
for file in "$@";do
. ${file}
let sum_red+=red
let sum_green+=green
let sum_yellow+=yellow
done
echo "red=$sum_red
green=$sum_green
yellow=$sum_yellow"