Ubuntu 20.04 LTS 上的 AWK 有何变化?

Ubuntu 20.04 LTS 上的 AWK 有何变化?

我正在处理一些大型天文数据库,我刚刚意识到 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 上出现空文件(当我在大学使用具有更好存储容量的新电脑时)。

那么,Ubuntu 20.04 中的 AWK 有什么不同?或者有人可以指出我的脚本有什么问题吗?

PS:我注意到 AWK 已从 1.3.3(18.04)更新到 1.3.4(20.04)。

答案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

也可以看看:

相关内容