2016-12-16 10 views
2

Я не могу понять, почему сравнение числа с плавающей точкой не работает в Мок:Поплавок сравнение в AWK и 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 

Я, очевидно, здесь что-то не так, но я не понимаю, что.

+0

Оба кода не являются одинаковыми, даже если они должны делать то же самое (тест на уровне шаблона для первого и внутри действия для ap второй - во второй). вы пытаетесь выполнить awk-версию с помощью mawk? – NeronLeVelu

+0

Я пробовал версию mawk последней команды: 'mawk '{if ($ 3> 10) print $ 3}' file.txt', результат тот же, значения ниже 10 не отфильтровываются, например:' 17.9344; 3,68367; 2,37445; 163,557; 172.775'. Может быть, что-то связано с неравномерной длиной дробных частей в моих значениях? –

ответ

1

Он не работает, если файл имеет терминаторы линии 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) изменение десятичные разделители запятые и трубы его к Мок:

mawk '$3 > 10' <(cat file.txt | sed -e "s/\./,/") 
+0

'dos2unix foo && mawk '$ 3> 10' foo' по-прежнему дает тот же результат. Также 'mawk 'sub (/ \ r /," ")'' не дает никакого результата (вывод пуст). Результатом 'file foo' является' foo: ASCII text' –

+2

В какой локали вы находитесь (введите 'locale')? Возможно, ваш язык использует другой десятичный разделитель, например, запятую. –

+2

Вы правы! Это проблема локали. Он отлично работает после того, как я меняю периоды на запятые: 'mawk '$ 3> 10' <(cat out.idepth | sed -e" s /\./,/ ")'. Хорошо помнить, что mawk использует локальную информацию, а awk - нет. –

 Смежные вопросы

  • Нет связанных вопросов^_^