分组并过滤结果

Bha*_*hra 2 unix bash shell

我有一个由管道分隔的文件,我必须按字段进行分组并获取其出现的总和.

我的输入文件如下:

96472|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
96472|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
96472|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
214126|Text1|6|A|City|Austin, TX|0123|9899|2017-02-12
Run Code Online (Sandbox Code Playgroud)

这就是我这样做的方式:

cut -d'|' -f1 somefile.txt | cut -d'-' -f1 | sort | uniq -c 
output is 
 3 96472
 10 214126
Run Code Online (Sandbox Code Playgroud)

基本上我想总结一个字段的出现,就像在sql中的group by子句一样.所以在我的例子中,我显示字段/列1的重复值为3和10

我相信有更好的方法可以做到这一点.而且我还想过滤那些少发生10次的记录:

cut -d'|' -f1 somefile.txt | cut -d'-' -f1 | sort | uniq -c | grep -v 10
Run Code Online (Sandbox Code Playgroud)

是否有很好的方法来实现这两个目标?

Ini*_*ian 6

一个简单的awk逻辑就足够了,而不是使用其他实用程序.对于您的输入文件,输出如下;

awk -F"|" '{count[$1]++}END{for (i in count) print count[i],i}' file
3 96472
10 214126
Run Code Online (Sandbox Code Playgroud)

这个想法count[$1]++增加了$1文件中的出现次数,一旦文件被处理,该END子句就打印出每个唯一字段的总数.$1

另一个过滤器只列出小于10的那些

awk -F"|" '{count[$1]++}END{for (i in count) if (count[i] < 10){print count[i],i}}' file
3 96472
Run Code Online (Sandbox Code Playgroud)