UNIX shell:按字长和ASCII顺序对字符串进行排序

LOL*_*KFC 7 unix sorting shell awk command-line

我想按长度排序一个字符串,然后用ASCII顺序(大写和小写相等)用unix命令排序.

string = [a-z][A-Z][0-9]
Run Code Online (Sandbox Code Playgroud)

例如:

"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
Run Code Online (Sandbox Code Playgroud)

Ken*_*ent 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}' 
Run Code Online (Sandbox Code Playgroud)

让我们举个例子:

"Hello stackoverflow how are you today foo bar xoo yoo ooo"
Run Code Online (Sandbox Code Playgroud)

尝试上面的行:

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     
Run Code Online (Sandbox Code Playgroud)

用你的第一个例子进行测试:

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
Run Code Online (Sandbox Code Playgroud)