首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在awk命令替换中使用bash变量为另一个变量赋值

如何在awk命令替换中使用bash变量为另一个变量赋值
EN

Stack Overflow用户
提问于 2021-06-02 11:38:10
回答 2查看 54关注 0票数 1

我有10个文件名为

代码语言:javascript
代码运行次数:0
运行
复制
data_00
data_01
data_02
...
data_09

数据文件的前8行如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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变量,并获得它们之间的差异。

代码语言:javascript
代码运行次数:0
运行
复制
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次:

代码语言:javascript
代码运行次数:0
运行
复制
(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变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-02 12:20:14

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

代码语言:javascript
代码运行次数:0
运行
复制
awk 'NR>=6 && NR<=8 {print $1-$2}' "data_$i"
票数 5
EN

Stack Overflow用户

发布于 2021-06-02 19:41:25

您可以在计算之前将E表示法转换为10^,例如:

代码语言:javascript
代码运行次数:0
运行
复制
read a b c < <(tail -n3 data_00            |
               sed 's/e+\?/*10^/g; s/ /-/' |
               bc -l                       |
               tr '\n' ' ')
echo $a $b $c

输出:

代码语言:javascript
代码运行次数:0
运行
复制
-49.7983863662139891
-49.7983863662139891
-49.7983863662139891
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67798585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档