Ice*_*ode 2 awk text-processing
我有一个如下所示的文件:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我想在负数之前添加一个空格,而不修改科学计数法或负数本身。
如果负数是该行(第一列)中的第一个,只是从第 2 列到该行末尾,我也不想添加空格。
我也想用awk。
我希望我的解释很清楚。
谢谢你!
-
因此,本质上,如果紧邻之前的字符-
是数字,则需要在每个之前添加一个空格。你可以这样做,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
Run Code Online (Sandbox Code Playgroud)
或者 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
Run Code Online (Sandbox Code Playgroud)
对于上述两者,-i
如果您想修改原始文件而不是打印出来,请添加:
sed -i -E 's/([0-9])-/\1 -/g' file
perl -i -pe 's/([0-9])-/\1 -/g' file
Run Code Online (Sandbox Code Playgroud)
这是一种在 GNUawk
任何现代版本mawk
和任何其他awk
支持 的版本中执行此操作的方法gensub
,由Ed Morton提供,他在现已删除的评论中提供了这一点:
awk '{print gensub(/([0-9])-/,"\\1 -","g")}' file
Run Code Online (Sandbox Code Playgroud)
使用 GNU awk
( gawk
),您可以使用-i inplace
edt 原始文件:
gawk -i inplace '{print gensub(/([0-9])-/,"\\1 -","g")}' file
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
610 次 |
最近记录: |