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

`awk`-使用科学记数法时定义指数中的位数,awk,printf,gawk,Awk,Printf,Gawk,我使用科学符号输入数据,如(制表符分隔) 使用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 printf使用s

我使用科学符号输入数据,如(制表符分隔)

使用
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

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中可用

嗯,我有一个
sed
解决方案(
sed-E's/E-?/&0/g'
),但希望得到一个直接的命令。正如你所说,显然不可能。
awk 'BEGIN{
  v="-3.00000000E-01 " 
  v=gensub("E([+-])([0-9][0-9]) ","E\\10\\2","",v )
  print v
  exit}'