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


11

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

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

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

回答:


13

uniqのデフォルトの動作は、7スペース幅の行で頻度を右揃えし、単一のスペースでアイテムから頻度を区切ります。

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

sedで先行スペースを削除します。

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

2
7スペース、別名「タブより少し小さい」。
クリリス

次に、次のようなタブで分割できますperl -pe 's/ *(\d+) /$1\t/'ここではいくつかの選択肢)。また、クリップボードにパイプしxclip -selection cて、スプレッドシートに直接貼り付けます。
パブロビアンキ

5

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

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

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

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

1

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()組み込み関数を調べることができます。

たとえば、カウント数を8進数で出力し、先頭に0を付け、その後に空白文字ではなくタブを付けて、NUL行終端記号を付けたい場合は、最後の行を次のように置き換えます。

    print(format(count, '08o'), item, sep='\t', end='\0')

使用法

スクリプトをファイルに保存して、sort_count.pyPythonで呼び出します。

python3 sort_count.py < input

0
uniq -c -i | tr -s ' ' | cut -c 2-

先頭の空白をtr -sで単一の空白に変換し、2番目の文字からの出力をcut -cで出力します。


あなたのソリューションは、空白シーケンスの発生をすべて絞り込みます。これは望ましい効果です。
Marc Vanhoomissen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.