シェルスクリプトにこのコードがあります。
sort input | uniq -c | sort -nr > output
入力ファイルには先行する空白はありませんでしたが、出力にはあります。どうすれば修正できますか?これはbashです
uniqのデフォルトの動作は、7スペース幅の行で周波数を右揃えし、単一のスペースでアイテムから周波数を分離することです。
ソース: https://www.thelinuxrain.com/articles/tweaking-uniq-c
Sedで先頭のスペースを削除します。
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
uniq -c
は、先頭に空白を追加します。例えば。
$ echo test
test
$ echo test | uniq -c
1 test
パイプラインの最後にコマンドを追加して削除できます。例えば。
$ echo test | uniq -c | sed 's/^\s*//'
1 test
FWIWでは、柔軟性を高めるために別の並べ替えツールを使用できます。 Pythonはそのようなツールの1つです。
#!/usr/bin/python3
import sys, operator, collections
counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
print(count, item)
理論的には、上記のプログラムはソートされたリストの代わりにハッシュテーブルを使用して重複行を識別するため、大規模な入力に対してsort
ツールよりも高速です。 (残念ながら、同じカウントの行は自然な順序ではなく任意の順序で配置されます。これは修正でき、2つのsort
呼び出しよりも高速です。)
出力形式の柔軟性を高めたい場合は、 print()
および format()
組み込み関数を調べることができます。
たとえば、最大7つの先行ゼロを含む8進数でカウント数を印刷し、その後にNUL行終端文字を含むスペース文字の代わりにタブを続ける場合、最後の行を次のように置き換えます。
print(format(count, '08o'), item, sep='\t', end='\0')
スクリプトをsort_count.py
と言うファイルに保存し、Pythonで呼び出します。
python3 sort_count.py < input