Я работаю с огромными астрономическими базами данных и только что понял, что awk работает не так, как ожидалось. Я скачиваю и режу некоторые .gz файлы, но awk ограничения странные, позвольте мне поделиться строкой из моего скрипта:
wget -c http://cdn.gea.esac.esa.int/Gaia/gedr3/gaia_source/GaiaSource_000000-003111.csv.gz && zcat GaiaSource_000000-003111.csv.gz |
awk -F, '$70<=10 && $70!=""' > GaiaCatalog_000000-003111.csv &&
rm GaiaSource_000000-003111.csv.gz
Командная строка выше должна скачать один файл базы данных, затем прочитать скачанный файл с zcat и ограничить строки, где значение столбца #70 меньше 10 (а также не нуля), сохраняя результат в GaiaCatalog *.csv файл. Наконец, команда удаления файла .gz.
Я убедился, что эти команды прекрасно работают на моем домашнем компьютере (ubuntu 18.04), но в результате они приводят к пустым файлам на ubuntu 20.04 (когда я использую новый компьютер с большей емкостью памяти в моем университете).
Итак, чем отличается AWK в Ubuntu 20.04? или Кто-нибудь может мне помочь, указав, что не так с моим скриптом?
PS: Я заметил, что AWK был обновлен с 1.3.3 (18.04) до 1.3.4 (20.04).
Хотя я не могу найти упоминания об этом в журнале изменений, похоже, что произошли изменения в том, как mawk
обрабатывает десятичный разделитель локали.
18.04 точка распознается как разделитель, даже если в локали задана запятая:
$ mawk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 2040
$ LC_NUMERIC=fr_BE.UTF-8 locale decimal_point
,
$ echo '99.9' | LC_NUMERIC=fr_BE.UTF-8 mawk '$1 <= 100'
99.9
, тогда как 20.04 разделитель локали, по-видимому, соблюдается.
$ mawk -W version
mawk 1.3.4 20200120
Copyright 2008-2019,2020, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan
random-funcs: srandom/random
regex-funcs: internal
compiled limits:
sprintf buffer 8192
maximum-integer 2147483647
$ LC_NUMERIC=fr_BE.UTF-8 locale decimal_point
,
$ echo '99.9' | LC_NUMERIC=fr_BE.UTF-8 mawk '$1 <= 100'
не дает вывода (потому что 99.9
анализируется в виде строки, и сравнение является лексическим).
У вас есть два варианта:
установить LC_NUMERIC
соответствующим образом, например.
LC_NUMERIC = C awk ....
переключиться на GNU awk, поведение которого по умолчанию - игнорировать LC_NUMERIC
, если не вызывается с - use-lc-numeric
См. Также: