সিক (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-কেবলমাত্র ব্রেস সম্প্রসারণ ব্যবহার করুন। ;)
কোজিরো

@ কোজিরো - সৎ হওয়ার পক্ষে কোন যুক্তি ;-) কমান্ডটি বিদ্যমান কিনা (যে স্ক্রিপ্টটি বিতরণ করা হচ্ছে কিনা তার উপর নির্ভর করে বা এটি বিবেচনাধীন হতে পারে) এর মধ্যে আমার মূল উদ্বেগ নয়, তবে কমান্ডটি প্রত্যাশা অনুযায়ী কার্যকর করেছে কিনা লেখক. bash4 এর ধনুর্বন্ধনী প্রসারণ প্রায় নিশ্চিত যে (যদি এটি কাজ করে, এটি আপনার প্রত্যাশার মতো কাজ করে) রয়েছে, যেখানে seqনা।
ক্রিস ডাউন

1
কেন এটি পোর্টেবল নয়? আপনার কাছে সূত্র বা প্রমাণ আছে? আমি আগ্রহী.
বেনোইট ডাফেজ

15

খাঁটি বাশ, ksh বা zsh এ অন্য উপায়:

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

খাঁটি পসিক্স শি উপায়:

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

1
forএর দ্বিতীয় প্রকাশটি পরীক্ষা এবং তৃতীয় ধাপ হওয়া উচিত।
manatwork

7

এখন, স্ট্যান্ডার্ড পসিক্সগুলি:

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

(মজার ব্যাপার হচ্ছে, সঙ্গে mawk(এবং একটি ক্ষুদ্রতর ব্যাপ্তি gawkপাশাপাশি) অনেক গনুহ তুলনায় দ্রুততর 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 , -

(যা যে কোনো আকারের সংখ্যা কিন্তু নোট সমর্থন করবেন ডিজিটের একটি নির্দিষ্ট সংখ্যক অতীত (নম্বর বৃহত্তর তুলনায় 10 যে 70 কমপক্ষে POSIX লোকেল) এ, লাইন ব্যাকস্ল্যাশ সঙ্গে আবৃত করা হবে)


1
জিএনইউ বিসি-তে আপনি BC_LINE_LENGTH=0পরিবেশে সেট করে লাইন র‌্যাপটি এড়াতে পারবেন । অন্যান্য বাস্তবায়নের ক্ষেত্রে এরকম ভাগ্য নেই।
গিলস 'অশুভ হওয়া বন্ধ করুন'

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

উদাহরণ:

$ সিক 10 -1 1

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.