2013-02-15 61 views
7

को अनदेखा करके मैं एक स्ट्रिंग को लंबाई से क्रमबद्ध करना चाहता हूं और फिर एक यूनिक्स कमांड के साथ ASCII ऑर्डर (ऊपरी और निचला मामला बराबर) द्वारा क्रमबद्ध करना चाहता हूं।यूनिक्स शैल: शब्द की लंबाई से स्ट्रिंग को क्रमबद्ध करें और ASCII क्रम से

string = [a-z][A-Z][0-9] 

उदाहरण के लिए:

"A a b B cc ca cd" : 
=> A a b B 
=> ca cc cd 

"Hello stackoverflow how are you today" 
=> are how you 
=> Hello today 
=> stackoverflow 
+0

+ 1 दिलचस्प समस्या ... – Kent

+0

'जीएनयू अजीब' का उपयोग कर एक एकल प्रक्रिया समाधान जोड़ा गया। यदि आप रुचि रखते हैं तो नीचे देखें। चीयर्स। – Steve

उत्तर

2

मैं एक बदसूरत (शायद) awk|sort|awk काम करने के लिए लाइन में लिखा था। यह एक अजीब प्रक्रिया में भी किया जा सकता है, हालांकि, मैं थोड़ी आलसी हूं, बस गंदा और त्वरित तरीके से जाओ।

echo yourStr|awk '{ 
split($0,o); for(x in o) print length(o[x]),o[x]}'|sort -n|awk '!p{printf $2;p=$1;next}$1==p{printf " "$2}$1!=p{printf "\n"$2;p=$1}' 

एक उदाहरण लेते हैं:

"Hello stackoverflow how are you today foo bar xoo yoo ooo" 

ऊपर लाइन के साथ कोशिश: अपने पहले उदाहरण के साथ

kent$ echo "Hello stackoverflow how are you today foo bar xoo yoo ooo"|awk '{ 
split($0,o); for(x in o) print length(o[x]),o[x]}'|sort -n|awk '!p{printf $2;p=$1;next}$1==p{printf " "$2}$1!=p{printf "\n"$2;p=$1}' 
are bar foo how ooo xoo yoo you 
Hello today 
stackoverflow  

परीक्षण:

kent$ echo "A a b B cc ca cd" |awk '{ 
pipe quote> split($0,o); for(x in o) print length(o[x]),o[x]}'|sort -n|awk '!p{printf $2;p=$1;next}$1==p{printf " "$2}$1!=p{printf "\n"$2;p=$1}' 
a A b B 
ca cc cd 
+0

ग्रेट। धन्यवाद, यह पूरी तरह से काम करता है। – LOLKFC

0

यहाँ एक ही रास्ता GNU awk का उपयोग कर रहा है। script.awk की

awk -f script.awk file 

सामग्री:: की तरह चलाने के लिए

A a B b 
ca cc cd 
are how you 
Hello today 
stackoverflow 

वैकल्पिक रूप से, यहां एक लाइनर है::

BEGIN { 
    IGNORECASE=1 
} 

{ 
    for(i=1;i<=NF;i++) { 
     a[length($i)][$i]++ 
    } 
} 

END { 

    for (i in a) { 
     b[x++] = i + 0 
    } 

    n = asort(b) 

    for (j=1;j<=n;j++) { 

     m = asorti(a[b[j]],c) 

     for (k=1;k<=m;k++) { 

      for (l=1;l<=a[b[j]][c[k]];l++) { 
       r = (r ? r FS : "") c[k] 
      } 

      s = (s ? s FS : "") r 
      r = "" 
     } 

     print s 
     s = "" 
    } 
} 

परिणाम आपके इनपुट, concatenated का उपयोग कर

awk '{ for(i=1;i<=NF;i++) a[length($i)][$i]++ } END { for (i in a) b[x++] = i + 0; n = asort(b); for (j=1;j<=n;j++) { m = asorti(a[b[j]],c); for (k=1;k<=m;k++) { for (l=1;l<=a[b[j]][c[k]];l++) r = (r ? r FS : "") c[k]; s = (s ? s FS : "") r; r = "" } print s; s="" } }' IGNORECASE=1 file