Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 用类似Fortran D格式的AWK打印F“;0.xxxxx d+;x"; 上下文_Shell_Awk_Sed_Fortran_Csh - Fatal编程技术网

Shell 用类似Fortran D格式的AWK打印F“;0.xxxxx d+;x"; 上下文

Shell 用类似Fortran D格式的AWK打印F“;0.xxxxx d+;x"; 上下文,shell,awk,sed,fortran,csh,Shell,Awk,Sed,Fortran,Csh,在Fortran编程语言中,当您要打印浮点时,有一种格式,即“D”格式。例如,浮动: 1234.56 将打印为: 0.123456D+4 是的,用D和这个带浮点的伪科学记数法 问题: 多亏了AWK和更少的“sed”,我想在我的shell中重现这种特定格式(顺便说一句,它是csh,但我们不在乎)。 AWK不是强制性的,但我认为这是一个很好的方法(开始时使用“e”格式%e,后面使用一些“sed”) 我在哪里 以下是我需要首先阅读的文本: NU 0.12345D+4 0.567

在Fortran编程语言中,当您要打印浮点时,有一种格式,即“D”格式。例如,浮动:

1234.56
将打印为:

0.123456D+4
是的,用
D
和这个带浮点的伪科学记数法


问题: 多亏了AWK和更少的“sed”,我想在我的shell中重现这种特定格式(顺便说一句,它是csh,但我们不在乎)。 AWK不是强制性的,但我认为这是一个很好的方法(开始时使用“e”格式%e,后面使用一些“sed”)


我在哪里 以下是我需要首先阅读的文本:

NU     0.12345D+4     0.56789D+5
这是Fortran中工具的典型输入/配置文件(要读取两个浮点)

下面是我在C-Shell中完整注释的代码:

set var_str_ori = `cat "$file" | awk '{print $2}'` # var_str_ori = "0.12345D+4"

# Transforming into a calculable float
set var_ori = `echo "$var_str_ori" | sed s/D/E/g | awk '{printf "%f", $1}'` # var_ori = 1234.500000

# Do some calculus
set var__new = `echo "$var_ori + 42.3" | \bc -l` # var_new = 1276.800000

# Re-formatting (the tricky part!)
set var_str_new = `echo "$var__new" | awk '{printf "%E", $1}' | awk -F. '{print "0."$1$2}' | awk -F"E+" '{print $1"D+0"$2+1}'` # var_str_new = "0.12768D+4"
并将新的
$var_str_new
格式良好地写入,以获得新文件,如下所示:

NU     0.12768D+4     0.56789D+5

如您所见,AWK/sed有一个技巧可以将真正的科学格式(
x.xxxxE+x
)重新格式化为Fortran D格式。好了,就这样!如果你有什么建议。。。请记住,我在C-Shell中,没有任何“函数”定义。它有点像纯贝壳


最后,我知道我可以简化我的代码,但这不是重点(这个例子故意冗长,没有优化)。我真正的问题是如何以类似于D Fortran的格式进行格式化

您可以在
awk
中编写函数

这可能会让你开始,它不处理负指数,但也可以很容易地添加

$ awk 'function tovalue(x) 
         {split(x,xa,"D"); 
          return xa[1]*10^xa[2]} 
       function format(x) 
         {p=length(int(x)); 
          return x/(10^p)"D+"p} 

       {print v2=tovalue($2), v3=tovalue($3), format(v2+11)}' file

1234.5 56789 0.12455D+4

您可以在
awk
中编写函数

这可能会让你开始,它不处理负指数,但也可以很容易地添加

$ awk 'function tovalue(x) 
         {split(x,xa,"D"); 
          return xa[1]*10^xa[2]} 
       function format(x) 
         {p=length(int(x)); 
          return x/(10^p)"D+"p} 

       {print v2=tovalue($2), v3=tovalue($3), format(v2+11)}' file

1234.5 56789 0.12455D+4

值得注意的是,您可能不需要担心Fortran工具的输入是否具有指示指数的
d
e
:它们的处理方式相同。您是对的,但这是一个特定的Fortran工具,需要输入
d
指数。尽管我完全同意francescalus的观点(通常,常用的E应该可以工作),如果您确实需要“0.1234D+12”格式(前导为零),那么编写一行Fortran代码(如双精度x;read*,x;print“(D15.6)”,x;end,将其保存到
test.f90
,编译(
gfortran test.f90
),然后在shell中使用.out可能会很有用(例如,
var=$(echo“1.23”|/a.out)
在bash中,它给出了0.123000D+01)。或者简单地说,我们可以用D(+|-)[数字]替换e(+|-)[数字]通过sed等?再次感谢,我知道。你完全正确。但我不管理我需要使用的Fortran可执行文件。出于其他原因,我需要使用csh脚本。谢谢你的所有评论,真的,但你和我都不能在我特定的专业环境下运行;)值得注意的是,您可能不需要担心Fortran工具的输入是否具有指示指数的
d
e
:它们的处理方式相同。您是对的,但这是一个特定的Fortran工具,需要输入
d
指数。尽管我完全同意francescalus的观点(通常,常用的E应该可以工作),如果您确实需要“0.1234D+12”格式(前导为零),那么编写一行Fortran代码(如双精度x;read*,x;print“(D15.6)”,x;end,将其保存到
test.f90
,编译(
gfortran test.f90
),然后在shell中使用.out可能会很有用(例如,
var=$(echo“1.23”|/a.out)
在bash中,它给出了0.123000D+01)。或者简单地说,我们可以用D(+|-)[数字]替换e(+|-)[数字]通过sed等?再次感谢,我知道。你完全正确。但我不管理我需要使用的Fortran可执行文件。出于其他原因,我需要使用csh脚本。谢谢你的所有评论,真的,但你和我都不能在我特定的专业环境下运行;)