行を最長から最短に並べ替えるのと同様に、ファイル内のすべての行を最短から最長に並べ替えるにはどうすればよいですか?例えば"
これは長い文章です。 これはそれほど長くはありません。 これは長くはありません。
それは次のようになります:
これは長くはありません。 これはそれほど長くはありません。 これは長い文章です。
行を最長から最短に並べ替えるのと同様に、ファイル内のすべての行を最短から最長に並べ替えるにはどうすればよいですか?例えば"
これは長い文章です。 これはそれほど長くはありません。 これは長くはありません。
それは次のようになります:
これは長くはありません。 これはそれほど長くはありません。 これは長い文章です。
それはあなたが与えたリンクとほぼ正確に同じです
awk '{ print length($0) " " $0; }' $file | sort -n | cut -d ' ' -f 2-
-r
オプションは、並べ替えを逆にすることでした。
perl -ne 'push @a, $_ } { print sort { length $a <=> length $b } @a' input
(私のボックスでは、これはソリューションの約4倍の速度で実行されawk | sort | cut
ます。)
これはひどいperlイディオムを使用し、のセマンティクスを悪用し-n
ていくつかのキーストロークを節約することに注意してください。これを次のように書く方が良いでしょう:
perl -ne '{ push @a, $_ } END { print sort { length $a <=> length $b } @a }' input
このソリューションは、大きな入力ではうまく機能しないことに注意してください。
内で並べ替えを行うこともできますawk
:
cat << EOF > file
This is a long sentence.
This is not so long.
This is not long.
EOF
sort.awk
# Only find length once
{ len = length($0) }
# If we haven't seen this line before add it to the lines array
# and move on to next record
lines[len] == "" { lines[len] = $0; next }
# A duplicate, append to the previous record
{ lines[len] = lines[len] RS $0 }
END {
# lines array is sorted according to the indices, the sorted
# indices are stored in the indices array
asorti(lines, indices)
for(key in indices)
print lines[indices[key]]
}
このように実行します:
awk -f sort.awk file
またはワンライナーとして:
< file awk '{ len = length($0) } lines[len] == "" { lines[len] = $0; next } { lines[len] = lines[len] RS $0 } END { asorti(lines, indices); for(key in indices) print lines[indices[key]] }'
出力:
This is not long.
This is not so long.
This is a long sentence.
別のperl実装:
perl -ne 'print length($_)." $_"' file | sort -n | cut -d ' ' -f 2-
$_
awkと同様に、現在の行です$0