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...
mikeserv

@mikeserv - इसे चारों ओर बदल दिया।
SLM

हाँ। तुम वहाँ जाओ। मुझे नहीं पता pasteथा कि किया। मुझे पढ़ाने के लिए धन्यवाद। एक उत्थान है।
मिकसेर्व

@mikeserv - हाँ, मेरा, स्टीफन या गिल्स ए का उपयोग कर रहा है joinऔर देख साइट के माध्यम से पढ़ा paste। वे 2 उपकरण बेहद शक्तिशाली हैं।
स्लम

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.ओह ओह का उपयोग करने की कोशिश की , अच्छा काम - मेरा उत्थान है।
मिकसरर्व

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()वर्तमान समय के आधार पर छद्म यादृच्छिक जनरेटर के बीज)।

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