web-dev-qa-db-ja.com

なぜこのコマンドは先頭に空白を入れたのですか?

シェルスクリプトにこのコードがあります。

sort input | uniq -c | sort -nr > output

入力ファイルには先行する空白はありませんでしたが、出力にはあります。どうすれば修正できますか?これはbashです

9
Jeremy Wik

uniqのデフォルトの動作は、7スペース幅の行で周波数を右揃えし、単一のスペースでアイテムから周波数を分離することです。

ソース: https://www.thelinuxrain.com/articles/tweaking-uniq-c

Sedで先頭のスペースを削除します。

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
12
Gounou

uniq -cは、先頭に空白を追加します。例えば。

$ echo test
test
$ echo test | uniq -c
      1 test

パイプラインの最後にコマンドを追加して削除できます。例えば。

$ echo test | uniq -c | sed 's/^\s*//'
1 test
5
wjandrea

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
1
David Foerster