如何使用awk进行除法运算?

3
我想读取文件并将所有元素除以0.03。精度非常重要。然后将结果保存在输出文件中。
 #!/bin/bash

var=$(cat 262_V01_C00_R000_TEx_BL_2048H.dat)
mapfile var < infile

awk '{for(i=1;i<=NF;i++) $i=$i*100/3}1' infile > output

但我得到了。
a4.sh: line 4: infile: No such file or directory

示例输入

-9.341203692800e+02
-9.320539972800e+02
-9.302205617600e+02

示例输出

-31137.345
-31068.466
-31007.352

“mapfile <” 应该是做什么的?请同时提供您的样本输入/输出。 - anubhava
@anubhava 使用mapfile从我的文件中读取数据。 - Richard Rublev
mapfile 是 Bash 4+ 中的 shell 内置命令,它将标准输入中的每一行读入一个索引数组变量中。 - anubhava
@anubhava 请看一下我的修改! - Richard Rublev
1
猜测一下:infile文件或目录不存在,是吗? - Ed Morton
2个回答

6
您可以使用以下的awk命令:
awk '$0+0 == $0 { printf "%.3f\n", $0 / .03 }' file
-31137.346
-31068.467
-31007.352
  • $0+0 == $0 会确保仅对具有有效数字的行执行此除法。
  • printf "%.3f" 会打印结果,并保留三个小数点位数。

输出文件应该只需添加>输出吗? - Richard Rublev
是的,awk '$0+0 { printf "%.3f\n", $0 / .03 }' file > output - anubhava
1
为什么是 $0+0?如果输入是 0.000,它不应该产生任何输出吗? - Ed Morton
1
啊,我的错,我想说 $0+0 == $0,以确保它仅对数字执行。 - anubhava
1
好的。我在问题中没有看到任何提示表明输入中有非数字,因此可能不需要这样做。 - Ed Morton

1
创建测试数据。
$ for i in {1..20}; do echo $RANDOM; done | pr -5ts' ' > file

将数值除以0.03等同于乘以100再除以3。

$ awk '{for(i=1;i<=NF;i++) $i=$i*100/3}1' file

814633 811567 251933 1075000 1.08787e+06
424000 799200 687733 657300 314367
239467 162433 343867 337533 61533.3
1.00403e+06 1.02077e+06 1034100 1036500 155133

我不明白,我的第一行代码没问题吗? - Richard Rublev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接