0

私の問題は、データの列の中に指数である値がいくつかあり、通常は 2.796e-05 の形式であることです。「e」の前の 10 進数値は常に変化しますが、常に e-05 になるようです。

だから私がこれまで試してきたのは(それがうまくいくことを期待してさまざまな量の変更を試みた)ことです:

sed -i -e 's/[0-9]*\.[0-9]*e-05/0/g' datafile.txt

これまでの私の試みはすべて結果をもたらしていません。今では、小さなことやそれに似たものを1つだけ除外していると確信していますが、それを見ることができないので、どんな助けも感謝します.

要求どおり: 入力は、次の形式の大きなファイルです。

19990207 8.891 6.1756 07/02/1999 9.707767 Q31
19990208 0.87234 5.2431 08/02/1999 10.239032 Q31
19990209 4.8225e-06 4.2400 09/02/1999 12.312976 Q31
19990210 0.00013825 5.3127 10/02/1999 10.353386 Q31
(The above is tab seperated butここでこれを表示する方法がわかりません)

出力については、基本的に太字の部分が 0 になることはありません。しかし、指数がある場所で 0 を取得する代わりに、何も起こらないようで、出力は入力と同じままです。

コードが使用されているスクリプトは少し長いですが、役に立ったら投稿できます。

4

1 に答える 1

1
re='-?([[:digit:]]+(\.[[:digit:]]*)?|[[:digit:]]*\.[[:digit:]]+)[Ee]-[[:digit:]]+'
sed -r "s/$re/0/g" file

-3e-3その正規表現は, 3.1e-1234,のような数字を受け入れます.14159E-01-- あります:

  • オプションのマイナス記号
  • 続いてどちらか
    • 必須の数字とオプションのドットと小数の数字または
    • オプションの数字と必須のドットと小数点以下の数字
  • E または e と負の整数が続きます。

[:digit:]利用可能なので、POSIX 文字クラスを使用します。

メンテナンスを少し簡単にするために、正規表現を変数に保存します。次に、シェル変数を置換できるように、sed プログラム本体を二重引用符で囲む必要があります。

sed の-rフラグを使用すると、多くのバックスラッシュ エスケープを回避できます。これは (私が思うに) GNU sed 拡張機能ですが、質問にというタグを付けたので、それが必要です。

于 2013-08-29T19:07:15.907 に答える