खोल
उच्च स्तरीय भाषा लोड होने में समय लगता है।
कुछ पंक्तियों के लिए, शेल स्वयं एक समाधान हो सकता है।
हम बाहरी कमांड sort
, और कमांड का उपयोग कर सकते हैं tr
। एक लाइनों को छांटने में काफी कुशल है और दूसरा एक सीमांकक को न्यूलाइन्स में बदलने के लिए प्रभावी है:
#!/bin/bash
shsort(){
while IFS='' read -r line; do
echo "$line" | tr "$1" '\n' |
sort -n | paste -sd "$1" -
done <<<"$2"
}
shsort ' ' '10 50 23 42'
shsort '.' '10.1.200.42'
shsort ',' '1,100,330,42'
shsort '|' '400|500|404'
shsort ',' '3 b,2 x,45 f,*,8jk'
shsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
<<<
केवल उपयोग की वजह से इसे बैश की जरूरत है । यदि वह यहाँ-डॉक के साथ बदल दिया जाता है, तो समाधान पॉज़िक्स के लिए मान्य है।
यह टैब, रिक्त स्थान या खोल ग्लोब पात्रों के साथ खेतों को सॉर्ट करने में सक्षम है ( *
, ?
, [
)। प्रत्येक पंक्ति को छांटा जा रहा है, क्योंकि नई लाइनें नहीं हैं।
फ़ाइल नाम संसाधित करने और इसे कॉल <<<"$2"
करने के <"$2"
लिए बदलें :
shsort '.' infile
सीमांकक पूरी फ़ाइल के लिए समान है। यदि वह एक सीमा है, तो उस पर सुधार किया जा सकता है।
हालाँकि सिर्फ 6000 लाइनों वाली एक फाइल को प्रोसेस होने में 15 सेकंड का समय लगता है। सच में, शेल फाइलों को प्रोसेस करने का सबसे अच्छा साधन नहीं है।
awk
कुछ लाइनों (कुछ 10 से अधिक) से अधिक के लिए वास्तविक प्रोग्रामिंग भाषा का उपयोग करना बेहतर है। एक अजीब समाधान हो सकता है:
#!/bin/bash
awksort(){
gawk -v del="$1" '{
split($0, fields, del)
l=asort(fields)
for(i=1;i<=l;i++){
printf( "%s%s" , (i==0)?"":del , fields[i] )
}
printf "\n"
}' <"$2"
}
awksort '.' infile
ऊपर बताई गई समान 6000 लाइनों वाली फ़ाइल के लिए केवल 0.2 सेकंड लगते हैं।
समझें कि शेल चर के अंदर लाइनों के <"$2"
लिए फ़ाइलों को वापस बदला जा सकता है <<<"$2"
।
पर्ल
सबसे तेज़ समाधान पर्ल है।
#!/bin/bash
perlsort(){ perl -lp -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' <<<"$2"; }
perlsort ' ' '10 50 23 42'
perlsort '.' '10.1.200.42'
perlsort ',' '1,100,330,42'
perlsort '|' '400|500|404'
perlsort ',' '3 b,2 x,45 f,*,8jk'
perlsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
यदि आप फ़ाइल परिवर्तन <<<"$a"
को बस क्रमबद्ध करना चाहते हैं "$a"
और -i
फ़ाइल संस्करण को "स्थान पर" बनाने के लिए पर्ल विकल्पों में जोड़ें :
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit