如何对多个文本文件中的值求和?

如何对多个文本文件中的值求和?

在 Ubuntu 桌面 20.04 中,我有 20 个目录,每个目录都包含一个同名的文本文件“weights”。这些文本文件包含约 20-30 个以空格分隔的数字。在这 20 个目录中,还有一个名为“coefficient”的文本文件,其中包含一个数字。

我想执行一个 shell 命令,进入每个目录,将“权重”文本文件中的所有数字相加,然后将该和乘以“系数”文本文件中的数字。如果有办法将其放入 csv 中,那就太理想了,但即使它只是打印到终端,也可以!

答案1

Perl 来救援!

perl -wle '
    for my $dir (@ARGV) {
        my $s = 0;
        open my $w, "<", "$dir/weights" or die "$dir: $!";
        $s += $_ for split " ", <$w>;
        open my $c, "<", "$dir/coefficient" or die "$dir: $!";
        print $s * <$c>;
}' -- */
  • -w打开警告
  • -l从输入中删除换行符并将其添加到输出中
  • 该参数*/由 shell 扩展为当前目录中的所有目录名(您path/to/parent/directory/*也可以指定)
  • 打开打开一个文件,"<"意味着阅读$w$c是相应的文件句柄
  • 菱形运算符<$w>从给定的文件句柄中读取一行

答案2

bash、coreutils 和 bc

您可以使用标准程序生成如下算术表达式:

for dir in *; do 
  printf "("
  tr ' ' + < $dir/weights | tr -d '\n'
  printf ") * "
  printf "%s\n" $(<$dir/coefficient)
done | bc -l

请注意,这假设您的文件中没有多余的空白。

演示

生成示例数据

mkdir -p testdir/{a..z}
cd testdir
for dir in *; do 
  n=$(shuf -r -i 20-30 -n1)
  shuf -r -i 0-100 -n $n | paste -d' ' -s > $dir/weights
  seq 0 .01 1 | shuf -n1 > $dir/coefficient
done

脚本在 testdir/ 中运行时的输出

1214.19
970.97
776.03
449.48
803.76
696.01
514.71
789.36
169.44
615.50
972.48
688.50
1290.76
635.97
824.90
787.39
83.36
1048.32
956.25
203.36
1144.66
327.70
65.40
367.68
828.80
919.75

如果希望输出以逗号分隔,请附加| paste -d, -s到。bc

相关内容