我有一个这样的文件:
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
任何人都可以帮忙吗?
答案 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)则增加第一个的计数器领域。最后打印出来。