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