Изменения в AWK на Ubuntu 20.04 LTS?

Я работаю с огромными астрономическими базами данных и только что понял, что 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).

0
задан 22 April 2021 в 04:23

1 ответ

Хотя я не могу найти упоминания об этом в журнале изменений, похоже, что произошли изменения в том, как 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 анализируется в виде строки, и сравнение является лексическим).

У вас есть два варианта:

  1. установить LC_NUMERIC соответствующим образом, например.

     LC_NUMERIC = C awk .... 
     
  2. переключиться на GNU awk, поведение которого по умолчанию - игнорировать LC_NUMERIC , если не вызывается с - use-lc-numeric

См. Также:

2
ответ дан 23 April 2021 в 23:19

Другие вопросы по тегам:

Похожие вопросы: