![如何对多个文本文件中的值求和?](https://linux22.com/image/1172700/%E5%A6%82%E4%BD%95%E5%AF%B9%E5%A4%9A%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%80%BC%E6%B1%82%E5%92%8C%EF%BC%9F.png)
在 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