#id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
13194139534963|Berty|Jean|male|1988-08-02|2012-04-02T08:33:15.012+0000|41.216.190.153|Google Chrome
13194139535544|Oliveira|Manuel|male|1984-10-31|2012-03-14T16:00:12.287+0000|109.71.166.230|Internet Explorer
13194139537327|Wei|Lei|male|1987-01-06|2012-03-13T03:07:51.899+0000|27.99.188.150|Internet Explorer
13194139539118|Alvarez|Monica|male|1989-10-17|2012-02-25T19:18:54.137+0000|190.169.213.242|Internet Explorer
13194139539746|Xu|Wei|female|1986-11-30|2012-03-19T23:16:12.495+0000|27.103.77.193|Firefox
说我有这个persons.dat文件。我被要求列出一次按字母顺序排序的所有浏览器,同时列出有多少用户使用它(用空格分隔)。我怎么能这样做?
答案 0 :(得分:1)
仅使用标准命令行Unix工具:
$ grep -vE '^#|^$' persons.dat | cut -d'|' -f8 | sort | uniq -c
1 Firefox
1 Google Chrome
3 Internet Explorer
首先,我们过滤掉评论(以#
开头的行)和空白行(^$
)与grep
,然后cut
- 仅过滤掉第8个字段(使用|
为分隔符),sort
按字母顺序排列,并以uniq -c
计算。
或者,如果您只想awk
:
$ awk -F'|' '!/^$|^#/ {cnt[$8]++} END{for(x in cnt) print cnt[x],x | "sort -k2"}' persons.dat
1 Firefox
1 Google Chrome
3 Internet Explorer
我们将每一行拆分为|
上的字段作为分隔符,然后使用cnt[$8]++
计算每个浏览器名称(第8个字段)的出现次数,但仅限于非空行和非注释行(即不匹配^$|^#
的行)。最后,我们迭代并打印累积的所有浏览器名称,另外通过shell调用将输出排序到第二个字段sort -k2
。
此外,要反转字段(名称,计数),您可以通过以下方式运行输出:
sed -E 's/ *([0-9]+) (.*)$/\2 \1/'
或者,在awk
的情况下,只需反转print
中的字段(以及排序键):
$ awk -F'|' '!/^$|^#/ {cnt[$8]++} END{for(x in cnt) print x,cnt[x] | "sort"}' persons.dat