Ubuntuデスクトップ20.04では、20個のディレクトリがあり、それぞれに同じ名前の「重み」のテキストファイルが含まれています。これらのテキストファイルには、スペースで区切られた20〜30個の数値が含まれています。 20のディレクトリのそれぞれに、「coefficient」という名前のテキストファイルが1つ含まれています。
各ディレクトリに移動し、「weights」テキストファイルのすべての数値を合計し、その合計に「coefficient」テキストファイルの数値を乗算するシェルコマンドを実行します。これをcsvに入れる方法があった場合は理想的ですが、ターミナルに出力するだけでも問題ありません。
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
は、入力から改行を削除し、出力に追加します*/
は、シェルによって現在のディレクトリ内のすべてのディレクトリ名に展開されます(path/to/parent/directory/*
も指定できます)"<"
は読み取り用のを意味します、$w
および$c
対応するファイルハンドル<$w>
は、指定されたファイルハンドルから行を読み取ります次のような標準プログラムで算術式を生成できます。
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
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
to bc
出力をカンマ区切りにする場合。