我有10个文件名为
data_00
data_01
data_02
...
data_09
数据文件的前8行如下所示:
Stamp_number
10
Item_number
9000
Position
5.1008068168967009e+00 5.4899193183110690e+01
5.1008068168967009e+00 5.4899193183110690e+01
5.1008068168967009e+00 5.4899193183110690e+01
所有10个文件具有相同的格式,但所有数字的值不同。
我希望使用awk为10个文件的第1列和第2列的第6、7和8行的值分配一个bash变量,并获得它们之间的差异。
for i in {00..09}; do
a=$(awk 'NR==6 {print $1}' data_$i)
b=$(awk 'NR==6 {print $2}' data_$i)
c=$(awk 'NR==7 {print $1}' data_$i)
d=$(awk 'NR==7 {print $2}' data_$i)
e=$(awk 'NR==8 {print $1}' data_$i)
f=$(awk 'NR==8 {print $2}' data_$i)
val_ab=`bc -l <<< "$a-$b"`
val_cd=`bc -l <<< "$c-$d"`
val_ef=`bc -l <<< "$e-$f"`
echo $val_ab
echo $val_cd
echo $val_ef
done
但这将输出以下语法错误10次:
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
(standard_in) 1: syntax error
0.000000
0.000000
0.000000
我尝试了data_"$i",data_$i,data_${i},但都失败了。如何在awk命令替换中使用for循环索引i(或任何其他bash变量)来分配bash变量?
发布于 2021-06-02 04:20:14
bc
不支持科学记数法,但awk
支持
awk 'NR>=6 && NR<=8 {print $1-$2}' "data_$i"
发布于 2021-06-02 11:41:25
您可以在计算之前将E表示法转换为10^
,例如:
read a b c < <(tail -n3 data_00 |
sed 's/e+\?/*10^/g; s/ /-/' |
bc -l |
tr '\n' ' ')
echo $a $b $c
输出:
-49.7983863662139891
-49.7983863662139891
-49.7983863662139891
https://stackoverflow.com/questions/67798585
复制相似问题