web-dev-qa-db-ja.com

複数のテキストファイルの値を合計する方法は?

Ubuntuデスクトップ20.04では、20個のディレクトリがあり、それぞれに同じ名前の「重み」のテキストファイルが含まれています。これらのテキストファイルには、スペースで区切られた20〜30個の数値が含まれています。 20のディレクトリのそれぞれに、「coefficient」という名前のテキストファイルが1つ含まれています。

各ディレクトリに移動し、「weights」テキストファイルのすべての数値を合計し、その合計に「coefficient」テキストファイルの数値を乗算するシェルコマンドを実行します。これをcsvに入れる方法があった場合は理想的ですが、ターミナルに出力するだけでも問題ありません。

3
BennyD

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/*も指定できます)
  • open はファイルを開き、"<"は読み取り用のを意味します$wおよび$c対応するファイルハンドル
  • ひし形演算子<$w>は、指定されたファイルハンドルから行を読み取ります
2
choroba

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 to bc出力をカンマ区切りにする場合。

0
Thor