使用shell脚本从多个文件进行数学运算

时间:2016-07-09 10:42:46

标签: bash shell scripting redhat

我有多个文件,让我们说

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

2 个答案:

答案 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内的资料只会执行一次,即在开头
  • FS是一个awk内置变量,代表字段分隔符。
  • 将FS设置为=表示awk将使用=来分隔字段/列。
  • 默认情况下,awk会将每一行视为记录。
  • 在这种情况下,您有两个字段,每个字段由$ 1和$ 2表示,每个记录都有=作为分隔符。
  • {color[$1]+=$2}创建(如果尚不存在)关联数组,其颜色名称为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
  • 这假设任何文件中都没有空行

答案 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"