我有一个如下所示的文件:
120E+00 360E+01 258E-09-784E+02
-847E+00-360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00-254E-01-223E-09-786E-02
E+00、E+01、E-01 等采用科学记数法表示 ^0、^1、^-1 等。
我想获取以下格式的文件:
120E+00 360E+01 258E-09 -784E+02
-847E+00 -360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00 -254E-01 -223E-09 -786E-02
我想在负数之前添加一个空格,而不修改科学计数法或负数本身。
如果负数是该行(第一列)中的第一个,只是从第 2 列到该行末尾,我也不想添加空格。
我也想用awk。
我希望我的解释很清楚。
谢谢你!
答案1
-
因此,本质上,如果紧邻之前的字符-
是数字,则需要在每个之前添加一个空格。你可以这样做,awk
但在这里这确实不是一个好的选择。这样做要简单得多sed
:
$ sed -E 's/([0-9])-/\1 -/g' file
120E+00 360E+01 258E-09 -784E+02
-847E+00 -360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00 -254E-01 -223E-09 -786E-02
或者 Perl:
$ perl -pe 's/([0-9])-/\1 -/g' file
120E+00 360E+01 258E-09 -784E+02
-847E+00 -360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00 -254E-01 -223E-09 -786E-02
对于上述两者,-i
如果您想修改原始文件而不是将其打印出来,请添加:
sed -i -E 's/([0-9])-/\1 -/g' file
perl -i -pe 's/([0-9])-/\1 -/g' file
awk
这是一种在 GNU任何现代版本mawk
和任何其他awk
支持的版本中执行此操作的方法gensub
,由埃德·莫顿谁在现已删除的评论中提供了这一点:
awk '{print gensub(/([0-9])-/,"\\1 -","g")}' file
使用 GNU awk
( gawk
),您可以使用-i inplace
edt 原始文件:
gawk -i inplace '{print gensub(/([0-9])-/,"\\1 -","g")}' file
答案2
sed -e "s/-[0-9]*E/ &/g" -e "s/^ -/-/g" file
输出
120E+00 360E+01 258E-09 -784E+02
-847E+00 -360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00 -254E-01 -223E-09 -786E-02
答案3
你绝对不需要所谓的“现代”awk 变体来完成它:
mawk 'gsub("[0-9][-]","&"_)gsub("."_," -")\
sub("[\t ]+$", "")_' \_='\3\21' file0.txt
120E+00 360E+01 258E-09 -784E+02
-847E+00 -360E+01 242E-08 420E+05
14E+00 360E+01 254E+00 78E+02
-120E+00 -254E-01 -223E-09 -786E-02
已确认适用于 gawk、mawk-1、mawk-2 和 nawk。
对于更简单的 vairant,它还修复了尾随空格/制表符,并考虑了科学记数法的变化:
mawk2 'gsub("[-][0-9]*[Ee][+-]?"," &")/-(NF=NF)<!_'