【问题标题】:seq uses both comma and dot as a decimal separatorseq 同时使用逗号和点作为小数分隔符
【发布时间】:2017-10-11 20:49:31
【问题描述】:

来自this 的回答我正在尝试使用点作为小数分隔符输出一个数字序列。

这行得通:

$ LANG=en_US seq 0.1 0.1 0.8
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8

$ LANG=en_US seq 0.1 0.1 1.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0

但这不是:

$ LANG=en_US seq 0.1 0.1 0.9
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0,9

为什么?我该如何解决?

【问题讨论】:

  • 它给了我正确的结果!!您使用的是哪个版本的 seq?
  • seq 不是 bash 的一部分——它是您的操作系统供应商可能会或可能不会提供的外部工具,并且由于它不是 POSIX 标准化的,因此无法保证它应该或应该采取哪种行为'不执行。也许这应该被标记为unix
  • (另外,因为它是由您的操作系统供应商提供的,所以您确实需要在问题中指定该操作系统,以便让人们有合理的机会重现手头的行为)。
  • 顺便说一句,你设置LC_ALL=C而不是LANG=en_US会有什么行为?如果这样可以解决问题,您将需要查看非LANG 语言环境变量。
  • @CharlesDuffy LC_ALL=C 解决了这个问题。谢谢!

标签: bash seq


【解决方案1】:

为了防止任何语言环境设置(例如LC_NUMERIC,这里可能是罪魁祸首)影响行为:

LC_ALL=C seq 0.1 0.1 0.9

也就是说,我根本不建议使用seq。这是一个非标准命令,不保证在所有 UNIX 平台上都可用,或者在它可用时具有任何特定行为。一个支持浮点的替代方案,考虑awk

LC_ALL=C awk -v min=0.1 -v max=0.9 -v inc=0.1 \
  'BEGIN { cur=min; while (cur <= max) { print cur; cur += inc; }; exit; }'

【讨论】:

  • 是的,区域设置肯定起到了一定的作用。不错的选择。 ++
【解决方案2】:

这可能是因为 LANG 变量设置了区域设置并导致 seq 表现得像这样。目前尚不清楚为什么,但要修复它明确,您可以联系我们tr。例如。

$ LANG=en_US seq 0.1 0.1 0.9 | tr "," "."
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9

【讨论】:

  • 顺便说一句,回复:我的编辑背后的推理——参见元数据上的When should code formatting be used for non-code text?;引用一致的答案,“代码格式不应该用于强调常规单词”。
  • @CharlesDuffy:我会记下这个查尔斯。感谢您提供此链接。
猜你喜欢
  • 2014-07-16
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多