分组并过滤结果

时间:2017-01-03 12:01:32

标签: bash shell unix

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

我的输入文件如下:

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

我就是这样做的:

cut -d'|' -f1 somefile.txt | cut -d'-' -f1 | sort | uniq -c 
output is 
 3 96472
 10 214126

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

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

cut -d'|' -f1 somefile.txt | cut -d'-' -f1 | sort | uniq -c | grep -v 10

有两种方法可以实现这两种目标吗?

3 个答案:

答案 0 :(得分:6)

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

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

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

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

$1

答案 1 :(得分:0)

只是一个扩展你的命令的答案:

cut -d'|' -f1 somefile.txt | cut -d'-' -f2 | sort | uniq -c | awk '{ if ($1 < 10) print $0  }'

答案 2 :(得分:0)

假设您的数据位于文件txt

sort -t '|' -k 1 txt | uniq -c | awk -F"|" '{print $1}' | awk '{if($1 < 10) print $0}'

sort命令将:

  • -t '|'字符上的数据标记为'|',然后
  • 选择第一个令牌(-k 1)进行排序