2013-02-15 9 views
7

Chciałbym posortować ciąg według długości, a następnie według kolejności ASCII (wielkie i małe litery są równe) za pomocą polecenia unix.Powłoka UNIX: sortuj ciąg według długości słowa i według kolejności ASCII ignorując przypadek

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

Na przykład:

"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 interesujący problem ... – Kent

+0

Dodano pojedyncze rozwiązanie procesowe, używając 'GNU awk'. Jeśli jesteś zainteresowany, patrz poniżej. Twoje zdrowie. – Steve

Odpowiedz

2

pisałem brzydki (być może) awk|sort|awk linii, aby wykonać zadanie. Można to zrobić w jednym procesie awk, jednak jestem trochę leniwy, po prostu idę na brudną i szybką drogę.

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

weźmy przykład:

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

spróbować z powyższej linii:

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  

test z pierwszego przykładu:

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

Świetnie. Dzięki, działa idealnie. – LOLKFC

0

Oto jeden ze sposobów korzystania GNU awk. Biegać jak:

awk -f script.awk file 

Treść 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 = "" 
    } 
} 

wyników za pomocą wejścia, doklejane:

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

Alternatywnie, oto jedna wkładka:

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 
Powiązane problemy