今までとても近いです。スクリプトは単語を並べ替え、最も一般的な単語から最も一般的な単語まで表示しますが、単語が同じように共通の場合は並べ替える必要があります。
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
かの実装が行われます。基準推奨)まだ同じ順序で並べられた行に対して、最終バイトごとのソートステップが実行されます。
少なくともsort
GNU 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
k
2つの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
または互換バージョンの場合、-s
2番目のソートオプションを使用すると、同じ数値を持つ行の順序が変わることを防ぎます。
... | sort | uniq -c | sort -rns
(NetBSDの実装はsort
基本的にこれを行います。)