次のファイルがあります。
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
awk
mawk
以下は、最新バージョンの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
答え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で動作することが確認されています。
より単純なバリエーションの場合は、末尾のスペース/タブも修正し、科学表記の変更を考慮します。
mawk2 'gsub("[-][0-9]*[Ee][+-]?"," &")/-(NF=NF)<!_'