大家好,我得到了这个虚拟数据:
115,IROM,1
125,FOLCOM,1
135,SE,1
111,ATLUZ,1
121,ATLUZ,2
121,ATLUZ,2
142,ATLUZ,2
142,ATLUZ,2
144,BLIZZARC,1
166,STEAD,3
166,STEAD,3
166,STEAD,3
168,BANDOI,1
179,FOX,1
199,C4,2
199,C4,2
所需的输出:
IROM,1
FOLCOM,1
SE,1
ATLUZ,3
BLIZZARC,1
STEAD,1
BANDOI,1
FOX,1
C4,1
是通过计算不同的游戏ID(115,125等)得出的。例如
111,ATLUZ,1
121,ATLUZ,2
121,ATLUZ,2
142,ATLUZ,2
142,ATLUZ,2
将会
ATLUZ,3
由于它具有3个不同的游戏ID
我尝试使用
cut -d',' -f 2 game.csv|uniq -c
我得到以下输出的地方
1 IROM
1 FOLCOM
1 SE
5 ATLUZ
1 BLIZZARC COMP
3 STEAD
1 BANDOI
1 FOX
2 C4
我该如何解决?使用bash吗?
答案 0 :(得分:4)
在执行cut
命令之前,请执行uniq
。这将删除多余的行,然后您执行命令,即应用cut
提取2
字段并执行uniq -c
来计数字符
uniq game.csv | cut -d',' -f 2 | uniq -c
答案 1 :(得分:2)
您能否也尝试在一个awk
中关注以下内容?
awk -F, '
!a[$1,$2,$3]++{
b[$1,$2,$3]++
}
!f[$2]++{
g[++count]=$2
}
END{
for(i in b){
split(i,array,",")
c[array[2]]++
}
for(q=1;q<=count;q++){
print c[g[q]],g[q]
}
}' SUBSEP="," Input_file
给出的输出顺序与Input_file的第二个字段相同,如下所示。
1 IROM
1 FOLCOM
1 SE
3 ATLUZ
1 BLIZZARC
1 STEAD
1 BANDOI
1 FOX
1 C4
答案 2 :(得分:1)
使用GNU datamash
:
bnlearn:::smartSapply
使用awk
:
datamash -t, --sort --group 2 countunique 1 < input
awk -F, '!a[$1,$2]++{b[$2]++}END{for(i in b)print i FS b[i]}' input
试运行:
sort -u -t, -k2,2 -k1,1 input | cut -d, -f2 | uniq -c
如您所见,$ cat input
111,ATLUZ,1
121,ATLUZ,1
121,ATLUZ,2
142,ATLUZ,2
115,IROM,1
142,ATLUZ,2
$ datamash -t, --sort --group 2 countunique 1 < input
ATLUZ,3
IROM,1
和121,ATLUZ,1
被正确地认为只是一个121,ATLUZ,2
。
答案 3 :(得分:0)
不太优雅,但是您也可以使用awk。如果不允许相同的ID + NAME组合始终连续出现,则必须通过在输出之前读取整个文件来对它们进行计数:
awk -F, '{c[$1,$2]+=1}END{for (ck in c){split(ck,ca,SUBSEP); print ca[2];g[ca[2]]+=1}for(gk in g){print gk,g[gk]}}' game.csv
这将首先计算每对[COL1,COL2]对,然后对每个COL2计数有多少对不同的[COL1,COL2]对非零。
答案 4 :(得分:0)
这也可以解决问题。唯一的事情是您的输出未排序。
awk 'BEGIN{ FS = OFS = "," }{ a[$2 FS $1] }END{ for ( i in a ){ split(i, b, "," ); c[b[1]]++ } for ( i in c ) print i, c[i] }' yourfile
输出:
BANDOI,1
C4,1
STEAD,1
BLIZZARC,1
FOLCOM,1
ATLUZ,3
SE,1
IROM,1
FOX,1