2013-02-15 81 views
7

我想按字符串顺序排列一个字符串,然后按照ASCII顺序(大小写相同)使用unix命令。UNIX shell:按字长和按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 2013-02-15 11:20:43

+0

使用'GNU awk'添加了一个进程解决方案。如果你有兴趣见下面。干杯。 – Steve 2013-02-16 16:58:19

回答

2

我写了一个丑陋的(也许)awk|sort|awk线来完成这项工作。它也可以在一个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 2013-02-15 14:49:24

0

下面是使用GNU awk的一种方式。的script.awk

awk -f script.awk file 

内容:像运行

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

结果使用您的输入,然后连接起来:

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

另外,这里是一个班轮:

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