如何计算Linux bash中每个不同行的行数

时间:2015-01-07 14:08:26

标签: linux bash count

我有一个这样的文件:

id|domain
9930|googspf.biz
9930|googspf.biz
9930|googspf.biz
9931|googspf.biz
9931|googspf.biz
9931|googspf.biz
9931|googspf.biz
9931|googspf.biz
9942|googspf.biz

我想计算一个不同的ID出现在我的数据中的次数,如下所示:

9930|3
9931|5
9942|1

我怎么能用linux bash做到这一点?目前我正在使用这个,但我正在计算所有这些:

cat filename | grep 'googspf.biz'| sort -t'|' -k1,1 | wc

任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

试试这个:

awk -F'|' '
    /googspf.biz/{a[$1]++}
    END{for (i in a) {print i, a[i]}}
' OFS='|' file

awk '
    BEGIN {FS=OFS="|"}
    /googspf.biz/{a[$1]++}
    END{for (i in a) {print i, a[i]}}
' file

答案 1 :(得分:3)

sed 1d file | cut -d'|' -f1 | sort | uniq -c

答案 2 :(得分:1)

我首先考虑使用uniq -c-c用于计数),因为您的数据似乎已经排序:

~$ grep "googspf.biz" f | cut -d'|' -f1|uniq -c
      3 9930
      5 9931
      1 9942

为了格式化,我不得不使用awk:

~$ grep "googspf.biz" f | cut -d'|' -f1|uniq -c|awk '{print $2"|"$1}'
9930|3
9931|5
9942|1

但是,只有awk:

~$ awk -F'|' '/googspf/{a[$1]++}END{for (i in a){print i"|"a[i]}}' f
9930|3
9931|5
9942|1

-F'|'使用|作为分隔符,如果行匹配googspf(或NR>1:如果行号是> 1)则增加第一个的计数器领域。最后打印出来。