我正在处理一些大型天文数据库,我刚刚意识到 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
被解析为字符串,并且比较是词汇的)。
你有两个选择:
设置
LC_NUMERIC
适当的例子。LC_NUMERIC=C awk ....
切换到 GNU awk,其默认行为是忽略,
LC_NUMERIC
除非使用--use-lc-numeric
也可以看看: