2009-04-15 36 views
0

我必須用gawk處理一些大文件。我的主要問題是我必須用千分離器打印一些浮標。例如:10000應該在輸出中顯示爲10.00010000,01作爲10.000,01用GAWK打印千分離的花車

我(和谷歌)想出這個功能,但這種失敗的花車:

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部分,然後在格式化整數後重新粘貼它們,但沒有更好的方法來完成它嗎?

免責聲明:

  • 我不是一個程序員
  • 我知道,通過一些shell的環境。變量可以設置千位分隔符,但它必須在具有不同lang和/或語言環境設置的不同環境中工作。
  • 英語是我的第二語言,對不起,如果我使用它錯誤地

回答

2

它失敗花車因爲,您將在歐洲類型的數字(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語句從最後開始。
  • 我們循環時,還剩下三個以上的字符。
  • 在循環內部,我們調整插入分隔符的位置,並插入它。
  • 一旦循環結束,我們返回調整後的值。