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は完全に非標準のツールであり、2つの実装が同じであるという保証はありません。bashの数値を逆方向に繰り返すループを作成する必要がある場合は、use for ((i=$max;i>=0;i--)) …などを使用します。
小次郎

回答:



20

一般に、を使用したくseqないので、移植性がありません(標準のLinux環境間でも)。ksh、zsh、またはbash4 +を使用している場合、ブレース拡張を使用できます。

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

1
それは短くて簡単ですが、私は古いbashバージョンを使用しています。
mtk

20
甘い答えですが、seq非標準であると指摘してからbash-4のみのブレース拡張を使用すると、皮肉があります。;)
小次郎

@kojiro-正直に言うと引数はありません;-)私の主な関心事は、コマンドが存在するかどうか(スクリプトが配布されているかどうかなどによって問題になるかどうか)ではなく、コマンドが期待どおりに実行されるかどうかではありません著者。bash4のブレース拡張はほぼ保証されています(動作する場合、期待どおりに動作します)が、そうではありseqません。
クリスダウン

1
なぜポータブルではないのですか?情報源または証拠はありますか?興味ある。
ブノワダッフェズ

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の2番目の式はテストで、3番目の式はステップです。
マナトワーク

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、環境で設定することで行の折り返しを回避できます。他の実装ではこのような運はありません。
ジル 'SO-悪であるのをやめる'

1
なぜループアラウンドs=$s,$iecho -n/ echo \c/ 呼び出しではなく、位置引数を使用するのprintfですか?
ジル 'SO-悪であるのをやめる'

2

tac(cat in reverse)を使用して順序を逆にすることができます。場合であっても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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.