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

How to count number of rows per distinct row in Linux bash

我有这样一个文件:

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

任何人都可以帮忙吗?

试试这个:

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

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

我首先想到使用 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 "|"}'
9930|3
9931|5
9942|1

但是,仅使用 awk:

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

-F'|' 使用 | 作为定界符,如果行匹配 googspf(或 NR>1:如果行的编号 >1)递增计数器第一场。最后相应地打印。

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