辞書/単語リストを最適化するにはどうすればいいですか?

辞書/単語リストを最適化するにはどうすればいいですか?

4.09 GB の単語リスト / 辞書のコピーを持っていますcrackstation.txt。単語と数字は通常の順序で並べられています。

0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStT uUvVwWxXyYzZ

次のように順序を並べ替えるにはどうすればよいでしょうか。

tTaAsShHwWiIoObBmMfFcCdDpPnNeEgGrRyYuUvVjJkKqQzZxX 1023985467

このシーケンスは、最も人気のあるもの(左)から最も人気のないもの(右)まで、英語の単語の最初の文字を人気順に示します。

答え1

grep、sed、awk、sortなどのツールを使用すると、いくつかの回答を実装できます。この他のサイトこれらには次のものが含まれます (b が必要な場合は、次に d、次に他のすべてが必要です)。

1 行目から始めて 2 行目というように、希望する順序で行を引き出します。

grep '^b' myfile > outfile
grep '^d' myfile >> outfile
grep -v '^b' myfile | grep -v '^d' | sort >> outfile

最初にカスタム「ソート キー」を追加し、次にソートし、後で削除します。

sed -e 's/^b/0&/' -e t -e 's/^d/1&/' -e 't' -e 's/^/2/' |
sort |
sed 's/^.//'

最も簡単なのは次のようになります:

カスタムソート関数を簡単に指定できる Perl、Python、Ruby などの言語を使用します。

perl -e 'print sort {($b =~ /^[bd]/) - ($a =~ /^[bd]/) ||
     $a cmp $b} <>'
python -c 'import sys; sys.stdout.write(sorted(sys.stdin.readlines(), key=lambda s: (0 if s[0]=="b" else 1 if s[0]=="d" else 2), s))'

または、awk を試してください (説明はありません、YMMV):

sort myfile | awk '$0 ~ /^b/ || $0 ~ /^d/ {print} $0 !~ /^b/ && $0 !~ /^d/ { a[f++] = $0 } END { for (word = 0; word < f; word++) { print a[word] } }'

関連情報