2013-02-15 6 views
7

Vorrei ordinare una stringa in base alla lunghezza e quindi in ordine ASCII (le lettere maiuscole e minuscole sono uguali) con un comando unix.shell UNIX: ordina una stringa in base alla lunghezza della parola e in ordine ASCII che ignora il caso

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

Ad esempio:

"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 problema interessante ... – Kent

+0

Aggiunta una soluzione di processo singola usando 'GNU awk'. Se sei interessato vedi sotto. Saluti. – Steve

risposta

2

ho scritto un brutto (forse) awk|sort|awk linea per fare il lavoro. potrebbe essere fatto anche in un processo awk, tuttavia, sono un po 'pigro, basta andare al modo sporco e veloce.

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}' 

diamo un esempio:

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

prova con riga sopra:

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  

di prova con il primo esempio:

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

Grande. Grazie, funziona perfettamente. – LOLKFC

0

Ecco un modo utilizzando GNU awk. Esegui come:

awk -f script.awk file 

Contenuto del script.awk:

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 = "" 
    } 
} 

risultati usando il vostro input, concatenati:

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

In alternativa, ecco l'one-liner:

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