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
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
awk|sort|awk
私はその仕事をするために醜い(多分)行を書いた。それは1つの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
を使用する 1 つの方法を次に示し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