ファイル内のフィールドの個別の値をカウントする


16

約百万行のファイルが含まれています。行には、transactionid繰り返し値を持つというフィールドがあります。私がする必要があるのは、それらを明確に数えることです。

値が何度繰り返されても、1回だけカウントされます。


ファイルのフォーマットを垣間見ることができれば、もっと簡単になります。必ずしもデータではありません。
ニキルマレー

ところで、あなたはそれが何回存在するかに関係なく値を1としてカウントしたいのですか、それとも発生/繰り返しの数のカウントが欲しいのですか?一度だけカウントしたい場合、異なる値はどのようにカウントされますか?あなたの質問の編集内容を確認し、通訳が正しいかどうかを確認してください。
ニキルマレー

@Nikhilこれは質問から明らかです... No matter of how many times a value is repeated, it should be counted as 1. ...

OK、それから@hesseからの答えはあなたの必要をするでしょう。
ニキルマレー

レイテンシーでごめんなさい。インターネットに接続できませんでした。セパレータは2 | 'です フィールドはフィールド28です。使用しました。 cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l if句は、明らかなように日付の別のチェック用でした:)
Olgun Kaya

回答:


22

OK、ファイルがテキストファイルであり、フィールドがカンマ区切り「、」で区切られていると仮定します。また、どのフィールド'transactionid'がその位置に関連しているかを知っています。'transactionid'フィールドが7番目のフィールドであると仮定します。

awk -F ',' '{print $7}' text_file | sort | uniq -c

これにより、7番目のフィールドの個別/一意の発生がカウントされ、結果が出力されます。


なぜコマンドのsort前にuniq
g10guang

@ g10guang uniq互いに隣接する必要があるレコードを削除するため。
dsz

3

たぶん最も洗練された方法ではありませんが、これは動作するはずです:

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

ここ$1で、解析するフィールドに対応する番号です。


3

ファイルをソートする必要はありません..(ファイルをソートするuniq必要があります)
このawkスクリプトは、フィールドが最初の空白削除フィールドであると想定しています。

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 

巨大なファイル(RAMのサイズに近づくなど)の場合、awkは多くのメモリを消費します。ほとんどのsort実装は、巨大なファイルにうまく対処できるように設計されています。
ジル「SO-悪であるのをやめる」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.