我有一个由管道分隔的文件,我必须按字段进行分组并获取其出现的总和.
我的输入文件如下:
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)
是否有很好的方法来实现这两个目标?
一个简单的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)
| 归档时间: |
|
| 查看次数: |
765 次 |
| 最近记录: |