如何在Bash中乘以小数

时间:2016-03-17 16:35:41

标签: arrays bash shell awk

我想将数组中的所有条目与3.17 * 10^-7之类的数字相乘,但Bash无法做到这一点。我尝试使用awkbc,但它不起作用。如果有人可以帮助我,我将不得不承担责任。

输入数据示例(整体4000数据文件):

TecN210500-0100.plt
TecN210500-0200.plt
TecN210500-0300.plt
TecN210500-0400.plt
......

这是我的代码:

#!/bin/bash

ZS=($(find . -name "*.plt")) 
i=1

Variable=$(awk "BEGIN{print 10 ** -7}")
Solutiontime=$(awk "BEGIN{print 3.17 * $Variable}")

for Dataname in ${ZS[@]}
do
    Cut=${Dataname:13}
    Timesteps=${Cut:0:${#Cut}-4}
    Array[i]=$Timesteps 
    i=$((i++))
    p=$((i++))
done

Amount=$p

for ((i=1;i<10;i++))
do
    Array[i]=${i}00
done

for (($i=1;i<$Amount+1;i++))
do
    Array[i]=$(awk "BEGIN{print ${Array[i]} * $Solutiontime}")
done

Array[0]=Solutiontime

第一循环: 提取e.i. &#34; 0100&#34;。

第二循环: &#34;删除&#34;领先零 - &gt; E.I. &#34; 100&#34;

最后一个循环: 与时间步长相乘 - &gt; E.I. &#34; 100 * 3.17 * 10 ^ -7&#34;

2 个答案:

答案 0 :(得分:0)

awk救援!

awk 'BEGIN{print 3.17 * 10^-7 }'

3.17e-07

迭代1

awk -F'[-.]' '{printf "%s %e\n",substr($1,5),$2*3.17*10^-7}' file

210500 3.170000e-05
210500 6.340000e-05
210500 9.510000e-05
210500 1.268000e-04

用于作为输入的已发布文件名。

迭代2

如果您只需要计算出的数字,只需删除第一个字段

即可
awk -F'[-.]' '{printf "%e\n",$2*3.17*10^-7}' file

3.170000e-05
6.340000e-05
9.510000e-05
1.268000e-04

这将是脚本的输出。我强烈建议移动awk脚本中的任何逻辑,而不是在数组的shell级别上工作。

答案 1 :(得分:0)

对文件名做一点parameter expansion修剪,然后让awk为你做数学运算。

#!/bin/bash
for f in *.plt; do
    num=${f##*-}   # remove the stuff before the final -
    num=${num%.*}  # remove the stuff before the last .
    num=${num#0}   # remove the left-hand zero
    awk "BEGIN {print $num * 3.17 * 10**-7}"
done

或者,完全使用awk完成:

#!/bin/bash
for f in *.plt; do
    awk -v f="$f" 'BEGIN {gsub(/^TecN[[:digit:]]+-0?|.plt$/, "", f); print f  * 3.17 * 10**-7}'
done