UNIX:计算CSV文件中数字的出现次数

时间:2016-02-09 08:44:53

标签: bash unix awk sed grep

我有一个CSV文件,第一栏和第一栏第二列为IDdomain

#Input.txt
1,google.com
1,cnn.com
1,dropbox.com
2,bbc.com
3,twitter.com
3,hello.com
3,example.com
4,twitter.com
.............

现在,我想得到IDs的计数。是的,这可以在Excel /工作表中完成,但文件包含大约1.5万行。

Expected Output: 
1,3
2,1
3,3
4,1

我尝试使用cat Input.txt | grep -c 1,这让我知道' 1'作为3,但我想同时为个人ID计数。任何人都可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:2)

这是一种方法,尽管计数存在于1.列中:

$ zcat Input.txt.gz | cut -d , -f 1 | sort | uniq -c
      3 1
      1 2
      3 3
      1 4

这是使用awk的另一种方式:

$ awk -F , '{counter[$1]++}; 
  END {for (id in counter) printf "%s,%d\n",id,counter[id];}' Input.txt | 
  sort
1,3
2,1
3,3
4,1

答案 1 :(得分:2)

awk -F "," '{ ids[$1]++} END { for(id in ids) { print id, ids[id] } }' input

输入是带有数据的文件。

输出:

1 3
2 1
3 3
4 1

编辑:// 如果你想要一个逗号分隔输出,你需要像这样设置输出分隔符:

awk -F "," 'BEGIN { OFS=","} { ids[$1]++} END { for(id in ids) { print id, ids[id] } }' input

输出:

1,3
2,1
3,3
4,1

答案 2 :(得分:1)

这将在bash

中完成
$ for i in {1..4}; do echo -n $i, >> OUTPUT && grep -c $i Input.txt >> OUTPUT; done
$ less OUTPUT
1,3
2,1
3,3
4,1

答案 3 :(得分:1)

$ awk -F, '{ print $1 }' input.txt | uniq -c | awk '{ print $2 "," $1 }'
1,3
2,1
3,3
4,1

答案 4 :(得分:1)

这是一个纯粹的awk解决方案。它不会将整个文件映射到内存中,因此它可能会使用@ Joda的答案所需的内存较少,但它假定文件已排序:

awk -F, -v OFS=, '$1==prev{c++;next}{print prev,c; c=1}{prev=$1}END{print prev,c}' file