仅在特定列中打印一次不同的字符串以及找到它的次数

时间:2017-10-08 14:12:30

标签: bash awk sed

#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文件。我被要求列出一次按字母顺序排序的所有浏览器,同时列出有多少用户使用它(用空格分隔)。我怎么能这样做?

1 个答案:

答案 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