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