计算文件中字段的不同值


17

我的文件包含大约一百万行。在各行中,我有一个名为的字段transactionid,该字段具有重复值。我需要做的是分别计算它们。

无论一个值重复多少次,都应该只计数一次。


如果您仅可以瞥一眼文件的格式(不一定是数据),就会更容易。
Nikhil Mulley 2012年

顺便说一句,您是否希望将该值计算为1,而不考虑它存在多少次,还是希望对出现/重复的次数进行计数?如果您只希望对它进行一次计数,那么如何计算不同的值?您能检查我对您问题的编辑并确认我的口译能力是否正确。
Nikhil Mulley 2012年

@Nikhil从问题中可以很清楚地看到:... No matter of how many times a value is repeated, it should be counted as 1. ...

好的,那么@hesse的回答就可以满足您的需求。
Nikhil Mulley,2012年

抱歉,延迟。我无法上网。分隔符为2 |' 字段是字段28。 cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l if子句用于再次检查日期,似乎很明显:)
Olgun Kaya 2012年

Answers:


23

好的,假设您的文件是一个文本文件,其字段由逗号分隔符','分隔。您还将知道'transactionid'根据其位置是哪个字段。假设您的'transactionid'字段是第七字段。

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

这将计算第7个字段中的唯一/唯一出现次数并打印结果。


为什么sortuniq命令之前。
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实现旨在很好地处理大型文件。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.