テキストファイルで最も一般的な単語を表示し、同じように一般的な単語をアルファベット順に表示する方法

テキストファイルで最も一般的な単語を表示し、同じように一般的な単語をアルファベット順に表示する方法

今までとても近いです。スクリプトは単語を並べ替え、最も一般的な単語から最も一般的な単語まで表示しますが、単語が同じように共通の場合は並べ替える必要があります。

cat > file.txt
tr -c '[:alpha:]' '[\n*]' < file.txt |
  sed -r '/^.{,5}$/d' | sort | uniq -c | sort -nr | head -20 | cut -c 9-

どんなアイデアにも感謝します!

答え1

sort -nr行を逆順に並べ替えます。キーが指定されていないため、これは数字で始まり、1つ以上の空白文字が先頭にある行でのみ機能します。初期番号でソートした後、次のようないくつsortかの実装が行われます。基準推奨)まだ同じ順序で並べられた行に対して、最終バイトごとのソートステップが実行されます。
少なくともsortGNU coreutilsでは、この-rオプションは最後の比較にも適用され、結果は次のようになります。

$ printf '%s\n' '2 foo' '1 baz' '1 bar' '2 quux' | sort --debug -nr
sort: text ordering performed using ‘en_US.UTF-8’ sorting rules
2 quux
_
______
2 foo
_
_____
1 baz
_
_____
1 bar
_
_____

探しているソートコマンドは次のとおりです。

sort -b -k 1,1nr -k 2,2

k2つのeyが指定されます。最初はフィールド 1 で始まり、終了し、n数字とr赤数修飾子が適用されます。 2番目はフィールド2で始まり、終了し、修飾子は適用されません。つまり、現在のロケールソートの規則に従います。この-bオプションを使用すると、sort各ソートキーの先頭の空白文字は無視されます(最初のフィールドと2番目のフィールドの間の区切り文字が固定されている場合は実際には必要ありません)。

できること:

$ printf '%s\n' '2 foo' '1 baz' '1 bar' '2 quux' | sort --debug -b -k 1,1nr -k 2,2
sort: text ordering performed using ‘en_US.UTF-8’ sorting rules
2 foo
_
  ___
_____
2 quux
_
  ____
______
1 bar
_
  ___
_____
1 baz
_
  ___
_____

答え2

GNUsortまたは互換バージョンの場合、-s2番目のソートオプションを使用すると、同じ数値を持つ行の順序が変わることを防ぎます。

... | sort | uniq -c | sort -rns

(NetBSDの実装はsort基本的にこれを行います。)

関連情報