如何在 awk 命令替换中使用 bash 变量来分配另一个变量

时间:2021-06-02 03:38:10

标签: bash awk

我有 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 变量?

2 个答案:

答案 0 :(得分:5)

bc 不支持科学记数法,但 awk 支持

awk 'NR>=6 && NR<=8 {print $1-$2}' "data_$i"

答案 1 :(得分:0)

您可以在计算前将 E-notation 转换为 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
相关问题