[英]Float comparison in awk and mawk
我不明白為什么浮點數比較在 mawk 中不起作用:
mawk '$3 > 10' file.txt
[...]
9_6_F-repl 24834 38.8699
9_6_F 56523 17.9344
9_7_F 3196 3.68367
9_9_F 2278 2.37445
9_annua_M-merg 122663 163.557
9_huetii_F-merg 208077 172.775
[...]
雖然它在 awk 上表現完美:
awk '{if ($3 > 10) print $1}' file.txt
我顯然在這里做錯了什么,但我不明白是什么。
如果文件有 CRLF 行終止符,它將失敗。 先刪除\r
:
$ file foo
foo: ASCII text, with CRLF line terminators
$ mawk 'sub(/\r/,"") && ($3 > 10)' foo
9_6_F-repl 24834 38.8699
9_6_F 56523 17.9344
9_annua_M-merg 122663 163.557
9_huetii_F-merg 208077 172.775
或者,您可以使用dos2unix
等。
EDIT2 :如果您使用的語言環境以逗號作為小數點分隔符,它會影響 mawk 中的浮點數比較。
在這種情況下,您可以:
1)將語言環境設置為
LANG="en_US.UTF-8"
或者
2) 將小數點分隔符改為逗號,將 pipe 改為 mawk:
mawk '$3 > 10' <(cat file.txt | sed -e "s/\./,/")
您不需要設置語言環境,但需要考慮奇怪或錯誤的輸入:
如果輸入有一個點,或者任何字符的字節指令高於 ASCII“1”(這是很多東西):
9_6_F-repl 24834 9.
9_6_F 56523 9.
9_annua_M-merg 122663 9.
9_huetii_F-merg 208077 9.
9_annua_M-merg 122663 :5.333
這將完全無法產生正確的結果,因為將$3
作為字符串進行比較,其中 ASCII“9”大於 ASCII“1”:
mawk2 'sub("\r*",_)*(10<$3)'
9_6_F-repl 24834 9.
9_6_F 56523 9.
9_annua_M-merg 122663 9.
9_huetii_F-merg 208077 9.
9_annua_M-merg 122663 9.
9_annua_M-merg 122663 :5.333
要糾正它,只需在$3
旁邊添加+
:
mawk 'sub("\r*",_)*(10<+$3)'
如果您不太關心古老的gawk -P/-c/-t
模式,那么它甚至更簡單:
mawk '10<+$3' RS='\r?\n'
讓ORS
代表您處理\r
:: CR 。 通過放置?
在 RS 正則表達式中,您可以跳過有關使用iconv
或dos2unix
或更改locale
設置的所有步驟:
RS
——> ORS
會無縫處理它這樣,原始輸入文件將保持完整,以防您以后出於某種原因需要這些 CR。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.