文字の前にスペース文字を挿入する

文字の前にスペース文字を挿入する

次のファイルがあります。

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

awkmawk以下は、最新バージョンのGNUおよびその他のサポートされているバージョンawkでこれを行う方法ですgensubエドモートン今は削除されたコメントでこのコンテンツを提供しています。

awk '{print gensub(/([0-9])-/,"\\1 -","g")}' file

GNU awk()を使用すると、edt rawファイルをgawk使用できます。-i inplace

gawk -i inplace '{print gensub(/([0-9])-/,"\\1 -","g")}' file

おすすめ記事