2012-04-10 15 views
5

ファイルを読み込み、特定のフィールドの出現回数でソートしようとしています。私は、ログファイルから最も重複した日付を見つけたいと思って、私はuniq -cオプションを使い、降順でソートします。この"uniq -c"コマンドを使用するときに出力から数を削除する必要があります

uniq -c | sort -nr 

このようなものは、このようないくつかの出力を生成します -

809 23/Dec/2008:19:20 

カウントは私にとって問題で実際にある最初のフィールドを....私はから日付ONY取得したいです上記の出力を得ることができませんでした。私はカットコマンドを使用しようと、この

uniq -c | sort -nr | cut -d' ' -f2 

をしましたが、これは単に誰かが日付のみを得ることに私を助けて、カウントを切り落とすことができますしてください...空白を出力します。に

uniq -c | sort -nr | cut -c 9- 

:私は、以上の7桁の数である場合を除きだけ

23/Dec/2008:19:20 

おかげ

+0

あなたの出力はそれのように見えますか?私は 'echo 'を試みた809 23/Dec/2008:19:20' | cut -d '-f2'となり、それはうまく動作します – Anirudh

+1

使用中の 'uniq'の実装によっては、繰り返しカウント' 809'の前にスペースがゼロ個以上あることがあります。先行する空白がなければ、元の式は正常に動作します。 'uniq -c'のいくつかの実装は先行する空白を生成するので、問題に遭遇します。 –

+0

ジョナサン..それは完璧な推測だった....私はカウントの前に空白があることがわかります。 – ravi

答えて

8

uniqからのカウントはスペースが付いているので、あなたのような何かをする必要がありたいです列(文字位置)を9つ上にします。それとも、sedを使用することができます。

uniq -c | sort -nr | sed 's/^.\{8\}//' 

か:

uniq -c | sort -nr | sed 's/^ *[0-9]* //' 

この第二の選択肢は、10,000,000以上の繰り返し回数の顔に堅牢です。問題があると思われる場合は、cutの代替方法よりも優れている可能性があります。間違いなく他のオプションも利用可能です。


警告:カウントはマックOS X 10.7.3上の実験によって決定するが、coreutils 8.3からGNU uniqを使用していました。 BSD uniq -cは、1桁の数字の前に3つの先頭スペースを生成しました。

任意の先頭の空白を持っていないでしょう
printf("%d %s", repeat_count, line); 

:POSIX仕様はuniq -cからの出力を持つかのようにフォーマットされなければならないと言います。出力フォーマットでは、この可能性の分散を考えると、[0-9]正規表現とsedスクリプトはuniq -cから観測と理論出力の変動に対処するための最も信頼性の高い方法です:

uniq -c | sort -nr | sed 's/^ *[0-9]* //' 
+0

ありがとう....それは多くの助けと私は新しいコマンドsedを学んだ。私はまだこのシェルスクリプトの新機能です。 – ravi

4

代わりのcut -d' ' -f2

awk '{$1="";print}' 
を試してみてください

たぶん、あなたが最初に空白の1以上を削除する必要があります。

awk '{$1="";print}' | sed 's/^.//' 

かcompletly元whitspaceを維持し、sedを持つ:

uniq -c | sort -nr | awk '{print $1, $2}' 

また、あなたが簡単に単一のフィールドを印刷することがあります。

sed -r 's/^[^0-9]*[0-9]+//' 
+0

ありがとうございました..それは助けました – ravi

+0

ニース:包括的なソリューション、OS& 'uniq'のバージョンから独立しています。 – Sim

1

代替ソリューションはこれです。

+0

これは、2番目のフィールドに空白が含まれていない場合にのみ機能します。 – tripleee

1

あなたは下流のカウント・フィールドで作業したい場合は、次のコマンドを実行すると、左パディングなしで「パイプ優しい」タブ区切り形式に再フォーマットします:それは少しある

.. | sort | uniq -c | sed -r 's/^ +([0-9]+) /\1\t/' 

元のタスクのためにOPが意図したとおりにやり過ぎたが、再フォーマットした後、cutは、フィールドを削除するために使用することができます。

.. | sort | uniq -c | sed -r 's/^ +([0-9]+) /\1\t/' | cut -d $'\t' -f2- 
1

は1つのスペース区切り文字に複数のスペースを「絞る」するパイプチェーンにtr -sを追加します。

uniq -c | tr -s ' ' | cut -d ' ' -f3 

trは、不明確な場所で非常に便利です。残念ながら、それは最初の先頭のスペースを取り除かないので、-f3

関連する問題