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पूरी तरह से गैर-मानक उपकरण है और इस बात की कोई गारंटी नहीं है कि कोई भी दो कार्यान्वयन समान होंगे। यदि आपको एक लूप लिखने की आवश्यकता है जो बैश, उपयोग for ((i=$max;i>=0;i--)) …या इस तरह की संख्या में पीछे की ओर पुनरावृत्त करता है।
कोजिरो

जवाबों:


50

नकारात्मक वेतन वृद्धि का उपयोग करें

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

20

सामान्य तौर पर, आप उपयोग नहीं करना चाहते seq, यह पोर्टेबल (मानक लिनक्स वातावरण के बीच भी) नहीं है। यदि आप ksh, zsh, या bash4 + का उपयोग कर रहे हैं, तो आप ब्रेस विस्तार का उपयोग कर सकते हैं:

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

1
यह छोटा और त्वरित है, लेकिन मैं पुराने बैश संस्करण पर हूं।
mtk

20
मीठा जवाब है, लेकिन जब आप इंगित करते हैं तो कुछ विडंबना होती है जब आप seqगैर-मानक होते हैं और फिर बैश-4-केवल ब्रेस विस्तार का उपयोग करते हैं। ;)
कोजिरो

@kojiro - ईमानदार होने के लिए कोई तर्क नहीं ;-) मेरी मुख्य चिंता यह नहीं है कि क्या कमांड मौजूद है (यह इस बात पर निर्भर करता है कि स्क्रिप्ट वितरित की जा रही है या नहीं) आदि हो सकता है, लेकिन क्या कमांड निष्पादित करता है जैसा कि अपेक्षित है लेखक। bash4 के ब्रेस विस्तार में लगभग गारंटी है (यदि यह काम करता है, तो यह आपकी अपेक्षा के seqअनुरूप काम करता है), जबकि ऐसा नहीं है।
क्रिस डाउन

1
यह पोर्टेबल क्यों नहीं है? क्या आपके पास स्रोत या प्रमाण हैं? मेरी दिलचस्पी है।
बेनोइट डफेज

15

शुद्ध बैश, ksh या zsh में एक और तरीका:

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

एक शुद्ध POSIX श रास्ता:

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) seqके i = 10000000बजाय GNU की तुलना में बहुत तेज 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 , -

(जो किसी भी आकार की संख्या है, लेकिन टिप्पणी का समर्थन करेगा अंक की एक निश्चित संख्या अतीत (संख्या अधिक से अधिक 10 से कि 70 कम से कम POSIX स्थान) में, लाइनों बैकस्लैश के साथ लिपटे किया जाएगा)


1
जीएनयू बीसी में, आप BC_LINE_LENGTH=0वातावरण में सेटिंग करके लाइन रैप से बच सकते हैं। अन्य कार्यान्वयन पर ऐसा कोई भाग्य नहीं।
गाइल्स का SO- बुराई रोकना '

1
आस s=$s,$i- पास लूप या कॉल echo -n/ echo \c/ के बजाय स्थितीय तर्कों का उपयोग क्यों करें printf?
गिलेस एसओ- बुराई को रोकना '

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.