2009-02-11 12 views
7

में यादृच्छिक रूप से लाइनों को क्रमबद्ध नहीं करता है, मुझे फेडोरा लिनक्स-सिस्टम पर सॉर्ट कमांड के साथ काम करने के लिए यादृच्छिक-क्रम नहीं मिल सकता है।सॉर्ट -आर कमांड लिनक्स

कुछ संदर्भ जानकारी:

$ cat /etc/fedora-release 
Fedora release 7 (Moonshine) 
$ which sort 
/bin/sort 
$ man sort | grep -A 2 '\-R' 
     -R, --random-sort 
       sort by random hash of keys 

$ man sort | grep -A 3 '\-R' 
     -R, --random-sort 
       sort by random hash of keys 

     --random-source=FILE 

और परीक्षण:

$ echo -e "2\n1\n3\n5\n4" 
2 
1 
3 
5 
4 
$ echo -e "2\n1\n3\n5\n4" | sort -r # Sort in reverse order 
5 
4 
3 
2 
1 
$ echo -e "2\n1\n3\n5\n4" | sort -R # Sort in random order 
1 
2 
3 
4 
5 
$ # Fail! That's not random (I've tried it multiple times.) 
+0

काम करता है उबंटू आइबेक्स में अपेक्षा के अनुरूप - तो लगता है आपके संस्करण – Ken

+0

पीसीबीएसडी (फ्रीबीएसडी) के लिए विशिष्ट समस्या की तरह -आर या वैकल्पिक यादृच्छिक विकल्प नहीं है। सिगविन, फेडोरा कोर 10 और उबंटू के संस्करण सभी काम करते हैं। शायद अधिक जानकारी, सटीक ओएस संस्करण और पैकेज संस्करण की तरह? – Godeke

+0

आपके पास उपरोक्त सटीक ओएस संस्करण है, या आपको कुछ और चाहिए? मैं अभी घर पर हूं और यह उबंटू 8.04 पर काम करता है। अगर मैं इसे पा सकता हूं तो मैं कल पैकेज संस्करण प्रदान करूंगा (मैं आरपीएम और वाईयूएम के साथ अच्छा नहीं हूं)। :-) –

उत्तर

14

यह मेरी Ubuntu 8.04 मशीन पर काम करता है। शायद समस्या randoms का स्रोत है। मैनुअल से:

--random स्रोत = फ़ाइल

  get random bytes from FILE (default /dev/urandom) 
# this should give always the same result: 
echo -e '2\n1\n3\n5\n4' | sort -R --random-source=/dev/zero 

# this should be random: 
echo -e '2\n1\n3\n5\n4' | sort -R --random-source=/dev/urandom 
+0

डिफ़ॉल्ट रूप से/dev/urandom होना चाहिए, इससे कोई फर्क नहीं पड़ता।मैंने इसका परीक्षण किया, और इससे कोई फर्क नहीं पड़ता। हालांकि कोशिश करने लायक था! –

2

मैं अगर पार्टी इस तरह से काम करता है पता नहीं है, लेकिन ksh में "जिस कारण से" कमांड है जो आपको बताता है कि क्या आप निष्पादन करेंगे यदि आप तर्क को कमांड के रूप में टाइप करना चाहते थे, जबकि "कौन सा" आपको $ PATH में कमांड का पहला उदाहरण बताता है। उदाहरण के लिए:

wembley 0 /home/jj33 > which ls 
/bin/ls 
wembley 0 /home/jj33 > whence ls 
'/bin/ls -FC' 

मुझे शक है यह आपकी समस्या है, लेकिन एक अगले समस्या निवारण चरण सटीक पथ निर्दिष्ट (या एक बैकस्लैश के साथ एक संभव उर्फ ​​भागने) "प्रकार" के लिए होगा आप इसे जब निष्पादित करें:

$ echo -e "2\n1\n3\n5\n4" | /bin/sort -R 

उसके बाद, मुझे एक पर्यावरण या लोकेल सेटिंग पर संदेह हो सकता है जो इसे जीतने वाला बना रहा है। जरूरी नहीं कि महत्वपूर्ण है, लेकिन एलसी_ * चरों में अक्सर अप्रत्याशित दुष्प्रभाव होते हैं (पहली बात जो मैं एक नए बॉक्स पर करता हूं उसे एलसी_ALL = सी सेट करने के लिए सेट किया जाता है =))।

+0

यह भी ध्यान रखें कि सॉर्ट –

+0

में बनाया गया एक शेल हो सकता है जो "एक ही एल्गोरिदम का उपयोग करके एल्गोरिदम का उपयोग करके पर्यावरण परिवर्तनीय पाथ में सूचीबद्ध निर्देशिकाओं में निष्पादन योग्य या स्क्रिप्ट की खोज करता है।" मेरे पास कहां नहीं है। सटीक पथ एक ही परिणाम देता है। और एलसी_ओएल = सी मदद नहीं की। हालांकि बहुत अच्छे सुझाव हैं! लेकिन कोई पासा नहीं। :-( –

+0

'whence' का बैश का संस्करण 'टाइप' है:' $ जो echo ->/bin/echo' लेकिन '$ type echo -> गूंज एक खोल बनाया गया है' – sarnold

8
GNU coreutils पुस्तिका से

: इनपुट कुंजी hashing और फिर हैश मान छँटाई द्वारा

क्रमबद्ध। यादृच्छिक रूप से हैश फ़ंक्शन चुनें, यह सुनिश्चित करना कि यह टकराव से मुक्त है ताकि अलग-अलग कुंजियों के पास हैश मान भिन्न हो। यह इनपुट के यादृच्छिक क्रमपरिवर्तन की तरह है (शफ इनवोकेशन देखें), सिवाय इसके कि एक ही मान वाले कुंजियां को एक साथ क्रमबद्ध करें।

यदि एकाधिक यादृच्छिक सॉर्ट फ़ील्ड निर्दिष्ट हैं, तो सभी फ़ील्ड के लिए एक ही यादृच्छिक हैश फ़ंक्शन का उपयोग किया जाता है। विभिन्न क्षेत्रों के लिए विभिन्न यादृच्छिक हैश फ़ंक्शंस का उपयोग करने के लिए, आप एक से अधिक बार सॉर्ट कर सकते हैं।

जीएनयू सॉर्ट-आर एक ही इनपुट लेता है और इसे एक साथ जोड़ता है; यह धागा कुछ विकल्प प्रदान कर सकता है: How can I randomize the lines in a file using standard tools on Red Hat Linux?

1

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन यह समाधान बहुत अच्छी तरह से काम करता है ... बस मामले में किसी को लग रही है

dir='/home/path-to-folder' 
cd $dir 
file=`ls |sort -R |tail --lines=1` 
echo $file 
+0

मुझे नहीं पता कि यह कोड प्रासंगिक कैसे है प्रश्न के लिए। –

+0

@ आर्क-कुन - मैं सहमत हूं। "समाधान" प्रश्न के लिए प्रासंगिक नहीं है। –