`awk` - 使用科学记数法定义指数中的位数

时间:2015-07-30 13:24:38

标签: awk printf gawk

我使用科学记数法输入数据,如(TAB分隔)

-2.60000000E-001        -2.84200000E-011        1.00000000E+000 2.45060000E-010 0.00000000E+000 -1.98000000E-012

使用awk,我提取一些列并对另一列进行数学运算。为了确保格式符合要求,应用了printf:

awk '{ printf "%9.8E\t%9.8E\n", $1,sqrt($4) }' infile.dat

但是在我的输出中,指数的位数从3变为2:

-3.00000000E-01 1.90446843E-05

如何在printf语句中定义这些,以便获得所需的输出:

-3.00000000E-001 1.90446843E-005

1 个答案:

答案 0 :(得分:3)

printf使用stdio,但这并没有提供设置指数长度的方法。所以你需要自己运行。

awk 'BEGIN{
  v="-3.00000000E-01 " 
  v=gensub("E([+-])([0-9][0-9]) ","E\\10\\2","",v )
  print v
  exit}'

这会将值放入变量v,然后应用替换来搜索指数,如果它位于2个位置,则会增加0.如果它已经在3个位置,则不添加任何内容。

gensub仅在gawk中提供