使用 shell 脚本对多个文件进行数学运算
make math operation from multiple files with shell scripting
我有多个文件,比方说
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
[ awk ] 是你的朋友:
awk 'BEGIN{FS="=";}
{color[]+=}
END{
for(var in color)
printf "%s=%s\n",var,color[var]
}' fname1 fname2 fname3 >result
应该这样做。
揭秘以上内容
''
中包含的任何内容都是 awk 程序。
BEGIN
里面的东西只会执行一次,即最开始
- FS 是 awk 内置变量,代表字段分隔符。
- 将 FS 设置为
=
意味着 awk 将使用 =
来分隔 fields/columns.
- 默认情况下
awk
将每一行视为一条记录。
- 在这种情况下,每条记录中都有两个字段,分别用 $1 和 $2 表示,并以
=
作为分隔符。
{color[]+=}
创建(如果尚不存在)颜色名称为 key
的关联数组,并且 +=
将 field2 的 value
添加到此数组元素.请记住,关联数组在创建时被初始化为零。
- 这对输入 awk 的三个文件 fname1、fname2、fname3 重复
END{}
中的任何内容只会在最后执行,即在退出之前执行。
for(var in color)
是用于解析关联数组的 forloop 样式。
- 这里
var
将是一个 key
和 color[key]
指向值。
printf "%s=%s\n",var,color[var]
自我解释。
备注
- 如果所有文件名都以
fname
开头,您甚至可以用 fname*
代替 fname1 fname2 fname3
- 这假定任何文件中都没有空行
因为您的源文件是有效的 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"
我有多个文件,比方说
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
[ awk ] 是你的朋友:
awk 'BEGIN{FS="=";}
{color[]+=}
END{
for(var in color)
printf "%s=%s\n",var,color[var]
}' fname1 fname2 fname3 >result
应该这样做。
揭秘以上内容
''
中包含的任何内容都是 awk 程序。BEGIN
里面的东西只会执行一次,即最开始- FS 是 awk 内置变量,代表字段分隔符。
- 将 FS 设置为
=
意味着 awk 将使用=
来分隔 fields/columns. - 默认情况下
awk
将每一行视为一条记录。 - 在这种情况下,每条记录中都有两个字段,分别用 $1 和 $2 表示,并以
=
作为分隔符。 {color[]+=}
创建(如果尚不存在)颜色名称为key
的关联数组,并且+=
将 field2 的value
添加到此数组元素.请记住,关联数组在创建时被初始化为零。- 这对输入 awk 的三个文件 fname1、fname2、fname3 重复
END{}
中的任何内容只会在最后执行,即在退出之前执行。for(var in color)
是用于解析关联数组的 forloop 样式。- 这里
var
将是一个key
和color[key]
指向值。 printf "%s=%s\n",var,color[var]
自我解释。
备注
- 如果所有文件名都以
fname
开头,您甚至可以用fname*
代替fname1 fname2 fname3
- 这假定任何文件中都没有空行
因为您的源文件是有效的 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"