Seq使用逗号和点作为十进制分隔符。

3

根据这个答案,我想用点作为小数点来输出一系列数字。

以下方式可行:

$ 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版本是哪个? - Rahul Verma
seq 不是 bash 的一部分 - 它是一个外部工具,您的操作系统供应商可能会提供或不提供,并且由于它没有 POSIX 标准化,因此不能保证它应该或不应该实现哪些行为。也许这应该被标记为 unix - Charles Duffy
(此外,因为它是由您的操作系统供应商提供的,您确实需要在问题中指定该操作系统,以便让人们有合理的机会能够重现所遇到的行为。) - Charles Duffy
1
顺便问一下,将 LC_ALL=C 设置而不是 LANG=en_US 会得到什么行为?如果这样可以解决问题,您需要查看非 LANG 区域设置变量。 - Charles Duffy
1
LC_ALL=C 可以解决这个问题。谢谢! - nistel
显示剩余2条评论
2个回答

3
为了避免任何区域设置(例如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; }'

是的,区域设置肯定发挥了一定的作用。很好的选择。++ - Rahul Verma

1
可能是由于设置了区域设置的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

顺便提一下,关于我编辑的原因,请参见 Meta 上的“何时应该对非代码文本使用代码格式?”(When should code formatting be used for non-code text?)问题。引用共识答案:“不应该使用代码格式来强调常规单词”。 - Charles Duffy
@CharlesDuffy:我会记下来的 Charles。感谢你提供这个链接。 - Rahul Verma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接