我想将数组中的所有条目与3.17 * 10^-7
之类的数字相乘,但Bash无法做到这一点。我尝试使用awk
和bc
,但它不起作用。如果有人可以帮助我,我将不得不承担责任。
输入数据示例(整体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;
答案 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