在某个字符前插入空格字符

在某个字符前插入空格字符

我有一个如下所示的文件:

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 inplaceedt 原始文件:

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)<!_'

相关内容