你在這裏處理兩個相似但不同的問題,非十進制數據和非 - 您的awk
計劃中的文字文字。
見the POSIX-1.2004 awk specification,詞法約定:
8. The token NUMBER shall represent a numeric constant. Its form and numeric value [...]
with the following exceptions:
a. An integer constant cannot begin with 0x or include the hexadecimal digits 'a', [...]
所以AWK(假設你使用nawk
或mawk
)的行爲 「正確」。 gawk
(自版本3.1開始)默認情況下支持非十進制(八進制和十六進制)文字編號,但使用--posix
開關會將其關閉,如預期的那樣。
在這樣的情況下正常的解決方法是使用所定義的數字串行爲,其中一個數字串是有效地被解析爲C標準atof()
或strtod()
功能,支持0x
-prefixed號碼:
$ echo "0x14" | nawk '$1+1<=0x15 {print $1+1}'
<no output>
$ echo "0x14" | nawk '$1+1<=("0x15"+0) {print $1+1}'
21
這裏的問題是,這種說法並不正確,因爲POSIX-1.2004 also states:
A string value shall be considered a numeric string if it comes from one of the following:
1. Field variables
...
and after all the following conversions have been applied, the resulting string would
lexically be recognized as a NUMBER token as described by the lexical conventions in Grammar
UPDATE:gawk
旨在「2008 POSIX.1003。1「,但請注意,自2008版(請參閱IEEE Std 1003.1 2013 edition awk
here)允許strtod()
和實現相關的行爲不需要數字符合詞彙約定,這應該(隱含地)支持INF
和NAN
。中的文本Lexical約定同樣修改,以便允許在十六進制常量與0x
前綴
這不會表現(上給出的數字詞彙約束)相當的希望在gawk
:
$ echo "0x14" | gawk '$1+1<=0x15 {print $1+1}'
1
(注意是「錯誤的」數字a nswer,這已被隱藏通過|wc -l
) 除非你使用--non-decimal-data
太:
$ echo "0x14" | gawk --non-decimal-data '$1+1<=0x15 {print $1+1}'
21
參見:
此接受了答案,這SE question有一個可移植性的解決方法。
爲具有兩種類型的用於非十進制數字支持的選項是:
如果你搜索「AWK DEC2HEX」你可以找到後者的許多情況下,可通過一個在這裏使用。如果你想要像gawk的strtonum()
這樣的東西,你可以得到一個便攜式awk版本here。
可能的重複:http://stackoverflow.com/questions/3683110/how-to-make-calculations-on-hexadecimal-numbers-with-awk –
@RobertoNavarro完全不同的問題。我在詢問如何直接在awk命令中使用十六進制字面值(如第三個awk命令所示) – SheetJS
我一直在嘗試不同的變體,如果你願意,可以嘲笑這個,但是以爲我會在我點擊之前發佈它去睡覺:bash $ hex = 20; echo $((16#$ hex + 1))| echo'0x''awk'{printf「%x \ n」,$ 1;}'' –