Seq থেকে আউটপুট এলোমেলোভাবে কিভাবে?


11

আমি জানি যে আমি seqসংখ্যার এলোমেলো তালিকা তৈরি করতে ব্যবহার করতে পারি : 1, 2, 3, 4 ...

আমি এই সংখ্যাগুলি 3, 1, 4, 2 এর মতো এলোমেলো ক্রমে পেতে চাই ...

আমি জানি যে আমি shufকোনও ফাইলের লাইন পরিবর্তন করতে ব্যবহার করতে পারি । সুতরাং আমি seqকোনও ফাইলে এলোমেলো সংখ্যা লিখতে এবং তারপরে shufএলোমেলো করতে ব্যবহার করতে পারি - বা কোনও প্রকারের শাফল ফাংশন লিখি। তবে এটি অযথা জটিল বলে মনে হচ্ছে। একটি একক কমান্ডের সাহায্যে অ্যারেতে আইটেমগুলি এলোমেলো করার সহজ উপায় কি আছে?

উত্তর:


16

আপনি কেবল আউটপুটটি পাইপ করতে পারেন shuf

$ seq 100 | shuf

উদাহরণ

$ seq 10 | shuf
2
6
4
8
1
3
10
7
9
5

আপনি যদি আউটপুটটি অনুভূমিক হতে চান তবে এটিতে পাইপ করুন paste

$ seq 10 | shuf | paste - -s -d ' '
1 6 9 3 8 4 10 7 2 5 

$ seq 10 | shuf | paste - -s -d ' '
7 4 6 1 8 3 10 5 9 2 

$ seq 10 | shuf | paste - -s -d ' '
9 8 3 6 1 2 10 4 7 5 

এর মধ্যে কমা সহ এটি চান? ডিলিমিটারটি এতে পরিবর্তন করুন paste:

$ seq 10 | shuf | paste - -s -d ','
2,4,9,1,8,7,3,5,10,6

কমা দিয়ে একটি লাইনে এম পেতে আপনাকে কোনওভাবে ফর্ম্যাট করতে হবে। echo $(seq 10 | shuf)কাছে আসে কিন্তু কমা না।
মাইক্রজারভ

এটির আগে অনুভূমিক paste...
মাইকসার্ভ

@ মিমকিজার - এটিকে চারপাশে বদলে ফেলেছে।
SLM

হ্যাঁ। এই নাও. আমি জানি pasteনা। আমাকে শেখানোর জন্য ধন্যবাদ। একটি upvote আছে।
মাইক্রজারভ

@ মিকসার্ভ - হ্যাঁ সাইটটি আমার, স্টিফেন বা গিলস এ এর ​​ব্যবহার joinএবং ব্যবহারকারীর দিকে তাকিয়ে পড়ে paste। 2 টি সরঞ্জাম অত্যন্ত শক্তিশালী।
SLM

3

একটি একক কমান্ডের সাহায্যে অ্যারেতে আইটেমগুলি এলোমেলো করার সহজ উপায় কি আছে?

ধরে নিলাম আপনার কাছে দশমিক পূর্ণসংখ্যার একটি অ্যারে রয়েছে:

arr=(4 8 14 18 24 29 32 37 42)

আপনি অ্যারের উপাদানগুলি এলোমেলো করে ব্যবহার করতে printfএবং করতে পারেন shuf:

$ arr=($(printf "%d\n" "${arr[@]}" | shuf))
$ echo "${arr[@]}"
4 37 32 14 24 8 29 42 18

(উপরের ধারনা করে আপনি সংশোধন করেননি $IFS)।


আপনার যা যা প্রয়োজন তা দুটি পূর্ণসংখ্যার মধ্যে র্যান্ডম সংখ্যা হলে, বলুন 10এবং 20, বিকল্পটি shufব্যবহার করে আপনার অতিরিক্ত কোনও প্রক্রিয়া দরকার নেই -i:

$ shuf -i 10-20
12
10
20
14
16
19
13
11
18
17
15

থেকে উদ্ধৃতি man shuf:

   -i, --input-range=LO-HI
          treat each number LO through HI as an input line

এই যা। আমি এটিও দেখেছি shuf --helpকিন্তু আমি shuf -i 1 10হস্তক্ষেপ না করে -dash.ভাল ব্যবহার করার চেষ্টা করেছি, ভাল কাজ - আমার উচিৎ have
মাইক্রজারভ

2
printf '%s, ' `seq 1 10 | shuf`

এমনকি আপনার forলুপের দরকার নেই ।

আউটপুট

7, 3, 4, 10, 2, 9, 1, 8, 5, 6,

এগুলি শেল অ্যারে পেতে আপনি যা করেন:

( set -- $(seq 1 10 | shuf) ; printf '%s, ' "$@" )

আউটপুট

5, 9, 7, 2, 4, 3, 6, 1, 10, 8,

এবং তারপরে তারা আপনার শেল অ্যারেতে থাকবে।

যদি আপনি এগুলি শেল অ্যারেতে পান তবে আপনার এমনকি প্রয়োজনও হবে না printf:

( set -- $(seq 1 10 | shuf); IFS=, ; echo "$*" )

আউটপুট

9,4,10,3,1,2,7,5,6,8

যাইহোক, seqএবং printfএকে অপরের জন্য তৈরি করা হয়। উদাহরণস্বরূপ যদি আমি একটি স্ট্রিং 1000 বার পুনরাবৃত্তি করতে চাই?

printf 'a string\n%.0b' `seq 1 1000`

আউটপুট

a string

... 999 a stringলাইন পরে ...

a string

অথবা ...

printf 'a string,%.0b' `seq 1 10`

আউটপুট

a string,a string,a string,a string,a string,a string,a string,a string,a string,a string,

আমি 39 বার কমান্ড চালাতে চাই?

printf 'echo "run %d"\n' `seq 1 39` | . /dev/stdin

আউটপুট

run 1

... 38 runলাইন পরে ...

run 39

1

আপনি shufআউটপুট এলোমেলোভাবে কমান্ড ব্যবহার করতে পারেন , যেমন

%> for x in $(seq 1 10 | shuf); do echo -n "$x "; done; echo
4 10 8 7 1 6 3 5 2 9 

1

POSIXly, থেকে দশমিক পূর্ণসংখ্যার একটি শিফলে তালিকা তৈরি minকরতে max:

awk -v min=1 -v max=10 'BEGIN{
  for (i = min; i <= max; i++) a[i] = i
  srand()
  for (i = min; i <= max; i++) {
    j = int(rand() * (max - min + 1)) + min
    tmp = a[i]; a[i] = a[j]; a[j] = tmp
  }
  for (i = min; i <= max; i++) print a[i]
}'

সতর্ক থাকুন যে অনেকগুলি অবতরণ বাস্তবায়ন সহ, একই সেকেন্ডের মধ্যে দু'বার এই আদেশটি চালানো একই ফলাফলটি তৈরি করবে ( srand()বর্তমান সময়ের উপর ভিত্তি করে সিউডো-এলোমেলো জেনারেটরের বীজ হিসাবে )।

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