2012-04-25 79 views
4

如果我沒有記錯,AWK解析取決於OS語言的數(例如,echo "1,2" | awk '{printf("%f\n",$1)}'將在英語系統解釋爲1和1.2在逗號分隔整數的系統從小數部分)。AWK使其不太依賴於系統

我不知道,如果C的printf確實這也太,所以我將它們加入C標記。

我想修改前一個命令,以便它返回無論系統正在使用的相同的值(1.2)。

回答

8

歡迎區域的醜陋。要解決您的問題,請首先將語言環境設置爲C語言環境。

export LC_NUMERIC=C 
echo "1,2" | awk '...your code...' 

要關閉其他語言環境相關的蠢事,你可以

export LC_ALL=C 
+1

這是awk中的一個愚蠢。 tomofolery必須關閉,只是因爲awk打開了它。 Awk在這方面表現得像一個應用程序,而不是一種編程語言。它應該公開一個API讓'awk'程序設置語言環境,但不要觸及它。 – Kaz 2012-04-25 22:44:03

2

如果您使用gawk,您可以使用--use-lc-numeric選項。

$ LC_NUMERIC=de_DE.UTF-8 awk 'BEGIN {printf("%f\n", "1,2")}' 
1.000000 
$ LC_NUMERIC=de_DE.UTF-8 awk --use-lc-numeric 'BEGIN {printf("%f\n", "1,2")}' 
1,200000 

GAWK manual

POSIX標準說,AWK始終使用期間作爲小數點 點讀取awk程序的源代碼時,以及用於命令行 變量賦值(見其他參數)。但是,在解釋輸入數據 時,對於print和printf輸出,以及對字符串 轉換的編號,將使用本地小數點字符。下面是一些例子 表示行爲的差異,一個GNU/Linux系統上:

$ gawk 'BEGIN { printf "%g\n", 3.1415927 }' 
-| 3.14159 
$ LC_ALL=en_DK gawk 'BEGIN { printf "%g\n", 3.1415927 }' 
-| 3,14159 
$ echo 4,321 | gawk '{ print $1 + 1 }' 
-| 5 
$ echo 4,321 | LC_ALL=en_DK gawk '{ print $1 + 1 }' 
-| 5,321 

的「en_DK」語言環境是英語在丹麥,逗號作爲 小數點分隔符。在正常的「C」語言環境中,gawk將 '4,321'視爲'4',而在丹麥語言環境中,它視爲完整 數字4.321。

一些早期版本的gawk與 標準這個方面完全遵守。但是,在非英語語言環境中的許多用戶抱怨 這種行爲,因爲他們的數據使用期作爲小數點,所以 默認行爲恢復到使用一段作爲小數點 字符。您可以使用--use-lc-numeric選項(請參閱選項)至 force gawk以使用區域設置的小數點字符。 (GAWK也 使用區域的小數點字符在POSIX模式下, 通過--posix,或POSIXLY_CORRECT環境變量無論是。)

我從/usr/bin/printf

$ LC_NUMERIC=de_DE.UTF-8 /usr/bin/printf "%f\n" "1,2" 
/usr/bin/printf: 1,2: value not completely converted 
1,000000 
$ LC_NUMERIC=de_DE.UTF-8 /usr/bin/printf "%f\n" "1.2" 
1,200000 

但是,如果沒有能力的類似行爲重寫它。

如果你的目的是做相反的事情,那就是採取「歐洲」的輸入和輸出「美國」號碼,你將需要使用更強大的東西。可能的 Python或Perl及其語言環境模塊。