使用 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 将是一个 keycolor[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"