【问题标题】:UNIX shell: sort a string by word length and by ASCII order ignoring caseUNIX shell:按字长和忽略大小写的 ASCII 顺序对字符串进行排序
【发布时间】:2013-01-31 08:28:51
【问题描述】:

我想使用 unix 命令按长度排序字符串,然后按 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

【问题讨论】:

  • +1 有趣的问题...
  • 添加了使用GNU awk 的单进程解决方案。如果你有兴趣,请看下面。干杯。

标签: shell unix sorting command-line awk


【解决方案1】:

我写了一个丑陋的(也许)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

【讨论】:

    【解决方案2】:

    这是使用GNU awk 的一种方式。运行方式:

    awk -f script.awk file
    

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

    使用您输入的结果,串联:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 2017-06-21
      • 2011-05-13
      相关资源
      最近更新 更多