将两个文件的值相乘 - 但保留小数位

将两个文件的值相乘 - 但保留小数位

我有文件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

输出的小数位数将是两个操作数中的最大值,不一定是第一个操作数。

通过管道 tosed -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

相关内容