如何计算 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
我有这样一个文件:
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