我有一个由管道分隔的文件,我必须按字段进行分组并获取其出现的总和。
我的输入文件如下:
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
有两种方法可以实现这两种目标吗?
答案 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
)进行排序