(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux】日本語を含む文字列を文字サイズ順に並べ替えるワンライナー

スポンサーリンク

やりたいこと

以下のようなファイルがあった場合に

$ cat test.txt
いちに
onetwo
12
一二

日本語の文字も1文字扱いで文字数順に並び替えたい。

環境情報
GNU bash, 4.4.12(1)-release (x86_64-pc-linux-gnu)

やり方

以下を実行すると

$ cat test.txt  | while read line; do   echo "$line" | wc -m;echo $line; done | awk 'NR%2 != 0{printf "%s ", $1} NR%2 == 0 {printf "%s\n",$1}' | sed -e s/" "/,/g | sort -r | cut -d"," -f2-

以下のように降順となる。(-rオプションを外せば昇順)

onetwo
いちに
一二
12

以下、補足です。

補足

awkでも文字数を取ることが可能ですが、マルチバイトである日本語の文字数が大きくなってしまうため

$ cat test.txt  | awk '{print length, $0}'
9 いちに
6 onetwo
2 12
6 一二

以下記事と同様にwcコマンドを利用しています。

文字数と文字列が2行毎に表示されているので一行にまとめてsortをすれば冒頭で記載した要件を満たす処理が可能です。

以上。