両方のファイルの値を乗算しますが、小数点以下の桁数は維持します。

両方のファイルの値を乗算しますが、小数点以下の桁数は維持します。

私は持っていますファイル1.txt

0.1234
0.333
0.22
0.1

そしてファイル2.txt

2
10
100
100

私は行を掛け、file1.txtがこの場所/行の小数点以下の出力を出力するコマンドを探しています。 出力.txt

0.2468
3.330
22.00
10.0

これまで、私は次のコマンドを使用しました。 paste file1.txt file2.txt | awk '{printf "%.4f", ($1 * $2)}' > output.txt しかし、もちろん、「%.4f」は常に小数点以下の4桁を生成します。

答え1

awk 実装が基本 C ライブラリの動的幅と精度機能へのアクセスを提供する場合、数値にはfile1.txt仮数指数表現を含めることはできません。1.23e4、次のようなことができます。

$ paste file1.txt file2.txt | 
  awk '{split($1,a,/[.]/); printf "%.*f\n", length(a[2]), ($1 * $2)}'
0.2468
3.330
22.00
10.0

それとも、もっと強力なものかもしれません。

paste file1.txt file2.txt | 
  awk '{l = (match($1,/[.][[:digit:]]+/) > 0) ? RLENGTH-1 : 0; 
  printf "%.*f\n", l, ($1 * $2)
}'

答え2

paste+によってbc

$ paste -d '*' file1.txt file2.txt | bc
.2468
3.330
22.00
10.0

出力される小数点以下の桁数は両方のオペランドの最大値になり、必ずしも最初のオペランドではありません。

代わりsed -E 's/^(-?)\./\10./'に(または0.2468代わりに)。.2468-0.1-.1

そしてawk

$ awk -F. '{getline x < "file2.txt"; printf "%.*f\n", length($2), $0*x}' file1.txt
0.2468
3.330
22.00
10.0

答え3

awkを使用してください。

$ awk '
    NR==FNR { mult[NR]=$1; next }
    {
        prec = ( /\./ ? length($1)-index($1,".") : 0 )
        printf "%.*f\n", prec, $1 * mult[FNR]
    }
' file2.txt file1.txt
0.2468
3.330
22.00
10.0

関連情報