BASH基于两列进行选择和计数的区别

时间:2018-08-21 06:55:36

标签: bash csv awk count distinct

大家好,我得到了这个虚拟数据:

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吗?

5 个答案:

答案 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

使用sortcutuniq

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