我有一个CSV
文件,第一栏和第一栏第二列为ID
,domain
。
#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
计数。任何人都可以帮我解决这个问题吗?
答案 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