如果我沒有記錯,AWK解析取決於OS語言的數(例如,echo "1,2" | awk '{printf("%f\n",$1)}'
將在英語系統解釋爲1和1.2在逗號分隔整數的系統從小數部分)。AWK使其不太依賴於系統
我不知道,如果C的printf確實這也太,所以我將它們加入C標記。
我想修改前一個命令,以便它返回無論系統正在使用的相同的值(1.2)。
如果我沒有記錯,AWK解析取決於OS語言的數(例如,echo "1,2" | awk '{printf("%f\n",$1)}'
將在英語系統解釋爲1和1.2在逗號分隔整數的系統從小數部分)。AWK使其不太依賴於系統
我不知道,如果C的printf確實這也太,所以我將它們加入C標記。
我想修改前一個命令,以便它返回無論系統正在使用的相同的值(1.2)。
歡迎區域的醜陋。要解決您的問題,請首先將語言環境設置爲C語言環境。
export LC_NUMERIC=C
echo "1,2" | awk '...your code...'
要關閉其他語言環境相關的蠢事,你可以
export LC_ALL=C
如果您使用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
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及其語言環境模塊。
這是awk中的一個愚蠢。 tomofolery必須關閉,只是因爲awk打開了它。 Awk在這方面表現得像一個應用程序,而不是一種編程語言。它應該公開一個API讓'awk'程序設置語言環境,但不要觸及它。 – Kaz 2012-04-25 22:44:03