0

gawkで巨大なファイルを処理する必要があります。私の主な問題は、千のセパレーターを使用していくつかのフロートを印刷する必要があることです。例:出力のように10000表示され10.000ます。10000,0110.000,01

私(そしてグーグル)はこの関数を思いついたが、これはフロートでは失敗する:

function commas(n) {
  gsub(/,/,"",n)
  point = index(n,".") - 1
  if (point < 0) point = length(n)
    while (point > 3) {
      point -= 3
      n = substr(n,1,point)"."substr(n,point + 1)
    }
  sub(/-\./,"-",n)
  return d n
}

しかし、それはフロートで失敗します。

今、私は入力を整数と<1の部分に分割し、整数をフォーマットした後、それらを再度接着することを考えていますが、それを行うためのより良い方法はありませんか?

免責事項:

  • 私はプログラマーではありません
  • 私はいくつかのシェル環境を介してそれを知っています。変数千の区切り文字を設定できますが、言語やロケールの設定が異なるさまざまな環境で機能する必要があります。
  • 英語は私の第二言語です、間違って使用している場合は申し訳ありません
4

2 に答える 2

2

ヨーロッパのタイプ番号(100万と4分の1の場合は1.000.000,25)を渡すため、フロートで失敗します。カンマとピリオドを切り替えるだけで、指定した関数が機能するはずです。最初に現在のバージョンを1000000.25でテストして、ヨーロッパ以外の番号で機能するかどうかを確認します。

次のawkスクリプトはで呼び出すことができ"echo 1 | awk -f xx.gawk"、「通常」バージョンとヨーロッパバージョンの両方が動作していることを示します。以下を出力します。

123,456,789.1234
123.456.789,1234

明らかに、あなたは関数にのみ興味があります。実際のコードは、固定文字列ではなく、入力ストリームを使用して関数に値を渡します。

function commas(n) {
    gsub(/,/,"",n)
    point = index(n,".") - 1
    if (point < 0) point = length(n)
    while (point > 3) {
        point -= 3
        n = substr(n,1,point)","substr(n,point + 1)
    }
    return n
}
function commaseuro(n) {
    gsub(/\./,"",n)
    point = index(n,",") - 1
    if (point < 0) point = length(n)
    while (point > 3) {
        point -= 3
        n = substr(n,1,point)"."substr(n,point + 1)
    }
    return n
}
{ print commas("1234,56789.1234") "\n" commaseuro("12.3456789,1234") }

関数は、コンマとピリオドの処理を除いて同じです。以下の説明では、これらを区切り記号および小数と呼びます。

  • gsubは、既存のセパレーターをすべて元に戻すため、それらをすべて削除します。
  • ポイントは、それが開始点であるため、小数点がどこにあるかを見つけます。
  • 小数がない場合、ifステートメントは最後から始まります。
  • 3文字以上残っている間にループします。
  • ループ内でセパレーター挿入位置を調整して挿入します。
  • ループが終了したら、調整された値を返します。
于 2009-04-15T11:08:03.277 に答える