Sıraları (1) kullanarak ters sırada nasıl gösterebilirim?


36

Numaraları çeşitli sırayla yineledim. Bunları artan sırayla gösterebiliyorum, şöyle adımlar olsa bile:

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

Bunları ters sırayla da gösteremiyorum, ne sürekli ne de akıllıca.

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

Yukarıdaki komutlar için çıkış yok.

Kabuk bilgilerim:

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

Numaraları azalan düzende nasıl gösterebileceğimi bana bildirin.


10
Gelecekteki okuyucular seqiçin tamamen standart olmayan bir araçtır ve iki uygulamanın da aynı olacağının garantisi yoktur. Bash'te sayılar üzerinde geriye doğru yinelenen bir döngü yazmanız gerekirse, kullanın for ((i=$max;i>=0;i--)) …veya benzerini kullanın .
kojiro

Yanıtlar:


50

negatif artış kullanın

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

20

Genel olarak kullanmak istemiyorsunuz seq, taşınabilir değil (standart Linux ortamlarında bile). Ksh, zsh veya bash4 + kullanıyorsanız, küme ayracı genişletmesini kullanabilirsiniz:

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

1
Bu kısa ve hızlı, ama ben eski bash versiyonundayım.
mtk

20
Tatlı cevap, ama standart olmadığını belirtmek bazı ironi var seqve sonra sadece bash-4-brace genişletme kullanın. ;)
kojiro

@kojiro - Dürüst olmak gerekirse bir argüman yok ;-) Asıl kaygım, komutun var olup olmamasından değil (betiğin dağıtılıp dağıtılmadığına bağlı olarak olabilir veya olmayabilir), ancak komutun beklediği gibi çalışıp çalışmadığı değil. yazar. bash4'ün ayraç genişlemesi neredeyse garanti edildi (çalışıyorsa, beklediğiniz gibi çalışır), oysa seqki.
Chris Down,

1
Neden taşınabilir değil? Kaynaklarınız veya kanıtlarınız var mı? İlgilenirim.
Benoit Duffez

15

Saf bash, ksh veya zsh'ın başka bir yolu:

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

Saf bir POSIX sh yolu:

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

1
forikinci ifadesi test olmalı ve üçüncüsü adım olmalıdır.
Manatwork

7

Şimdi, standart POSIX olanlar:

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

(ilginç olan mawk(ve bir dereceye kadar gawk) yanı sıra bir çok daha hızlı GNU'da daha seqiçin i = 10000000yerine i = 10)

Veya

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

(özellikle az sayıda yinelemeyle daha verimli olur bash) , özellikle

Veya

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

(herhangi bir boyuttaki rakamları destekleyecektir, ancak belirli sayıda rakamdan ( POSIX yerel ayarında en az 10 70'den büyük rakamlar ) oluşan satırların ters eğik çizgilerle sarılacağını unutmayın.


1
GNU bc'de, BC_LINE_LENGTH=0çevreye ayarlayarak hat sarmasını önleyebilirsiniz . Başka uygulamalarda böyle bir şans yoktur.
Gilles 'SO- kötülükten vazgeç'

1
Neden döngüsel değişkenler yerine / / / s=$s,$içağrısı yerine konumsal argümanları kullanmalı ? echo -necho \cprintf
Gilles 'SO- kötülükten vazgeç'

2

Sıralamayı tac(tersine kedi) kullanarak tersine çevirebilirsiniz. seqÇeşitli sistemlerde farklı davransalar bile , aşağıdakilerin mümkün olduğunca taşınabilir olması gerektiğini düşünüyorum:

$ 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

İle deneyin:

   seq [OPTION]... FIRST INCREMENT LAST

Örnek:

$ seq 10 -1 1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.