簡體   English   中英

awk和mawk中的浮點比較

[英]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 正則表達式中,您可以跳過有關使用iconvdos2unix或更改locale設置的所有步驟:

  • RS ——> ORS會無縫處理它

這樣,原始輸入文件將保持完整,以防您以后出於某種原因需要這些 CR。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM