2017-04-05 6 views
0

大量のファイルを一連のコマンドにパイプして、そのファイルの特定の列に一意のエントリの数を表示しようとしています。私はシェルと未経験だけど、私はこれを考え出すことができた一方で、短い後:一連のファイルに一意の列エントリの数を表示する実行方法はありますか?

awk '{print $5 }' | sort | uniq | wc - l 

この一連のコマンドは、ファイルの少量のために正常に動作しますが、これらに許容以上の時間がかかります私の目標セットで実行してください。これをより効率的に実行できる一連のコマンドがありますか?

+0

'sort -u'の代わりに' sort |ユニークです。 –

+0

実際に処理しようとしている入力線の数は何ですか?あなたが実際にやろうとしていることを見ることができるように、サンプル入力データを少し入れていただけますか?あなたが入力したサンプル入力とともに期待される出力も含めてください。あなたは、各ファイルまたはすべてのファイルの列5の一意の項目を探していますか? – ghoti

答えて

1

あなたはawkを持つ単一のパスで5番目のフィールドに一意の値の発生をカウントすることができます

awk '{if (!seen[$5]++) ++ctr} END {print ctr}' 

これは、5番目のフィールドの値の配列を作成し、値が決して持っていない場合ctr変数をインクリメント前に見た。 ENDルールは、カウンタの値を出力します。 GNU AWKで

、あなたは、代わりにちょうど最終的には連想配列の長さを確認することができます。

awk '{seen[$5]++} END {print length(seen)}' 
1

はベンジャミンは良い油を供給しますが、依存に格納するだけでどのくらいのデータました(私はできる)awkのではなく、遠く@BenjaminWの以前のバージョンからを使用して

awk '!_[$5]++' file | wc -l 
1

sortestを最速:配列、それはとにかくWCするために、データを渡すために支払ってもよいです。私は少し速くので

awk '!E[$5]++{c++}END{print c}' YourFile 

作品全てawkのバージョン

0

GNUdatamashとプロセスで先に作られたテストの(差は非常に巨大なファイルに興味深いものになる可能性)機能をしていると思います列の場合:

datamash -W count 5 
関連する問題