如何使用seq(1)以相反的顺序显示数字?


36

我以各种顺序遍历数字。我能够以递增的顺序显示它们,甚至可以执行以下步骤:

$ seq --separator="," 1 10
1,2,3,4,5,6,7,8,9,10
$ seq --separator="," 1 2 10
1,3,5,7,9

我还能够以相反的顺序显示它们,既不是连续的也不是逐步显示的。

$ seq --separator="," 10 1   
$ seq --separator="," 10 2 1

以上命令无输出。

我的外壳详细信息:

$ bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

让我知道如何以降序显示数字?


10
对于将来的读者来说,它seq是一个完全非标准的工具,并且不能保证任何两个实现都是相同的。如果您需要编写一个循环来循环遍历bash中的数字,请使用for ((i=$max;i>=0;i--)) …或类似方法。
kojiro

Answers:


50

使用负增量

seq -s, 10 -2 1
10,8,6,4,2

20

通常,您不想使用seq,它不是可移植的(即使在标准Linux环境中也是如此)。如果您使用的是ksh,zsh或bash4 +,则可以使用大括号扩展:

echo {10..1..2} | tr " " ,
10,8,6,4,2

1
简短而快速,但是我使用的是较旧的bash版本。
mtk

20
答案很不错,但是当您指出它seq是非标准的然后使用仅bash-4括号扩展时,会有一些讽刺意味。;)
kojiro

@kojiro-老实说,没有论据;-)我主要关心的不是命令是否存在(取决于是否分发脚本等),而是命令是否按预期执行作者。bash4的大括号扩展几乎可以保证(如果可以正常工作,则可以按预期工作),而seq不能。
克里斯·

1
为什么它不便携?您有资料或证明吗?我很感兴趣。
Benoit Duffez 2015年

15

纯bash,ksh或zsh的另一种方式:

for ((i=10;i>0;i-=2)) ; do echo -n "$i," ; done

纯POSIX sh方式:

i=10
while [ "$i" -gt 2 ]; do printf "$i,"; i=$((i-2)); done
echo "$i"

1
for的第二个表达式应该是测试,第三个表达式是步骤。
manatwork

7

现在,标准POSIX的是:

awk 'BEGIN{for (i = 10; i > 0; i -= 2) print i}' | paste -sd , -

(有趣的是,用mawk(以及在较小程度上gawk也一样)有很多比GNU更快seq用于i = 10000000代替i = 10

要么

i=10; set --
while [ "$i" -gt 0 ]; do
  set -- "$@" "$i"
  i=$(($i - 2))
done
IFS=,
echo "$*"

(只有在进行少量迭代时,效率才会更高,尤其是bash

要么

echo 'for(i=10;i>0;i-=2) i' | bc | paste -sd , -

(这将支持任意大小的数字,但请注意,超过一定位数(至少在POSIX语言环境中大于10 70的数字),行将使用反斜杠进行包装)


1
在GNU bc中,可以通过BC_LINE_LENGTH=0在环境中进行设置来避免换行。在其他实现上没有运气。
吉尔斯(Gilles)'所以

1
为什么使用位置参数而不是循环s=$s,$i或调用echo -n/ echo \c/ printf
吉尔斯(Gilles)'所以

2

您可以使用反转订单tac(反目录)。即使seq在各种系统上的行为不同,我也认为以下内容应尽可能地可移植:

$ seq 1 10 | tr '\012' ',' | sed 's/,$//'; echo
1,2,3,4,5,6,7,8,9,10
$ seq 1 10 | tac | tr '\012' ',' | sed 's/,$//'; echo
10,9,8,7,6,5,4,3,2,1
$

2

尝试:

   seq [OPTION]... FIRST INCREMENT LAST

例:

$ seq 10 -1 1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.