bash汇总和分组列

时间:2018-08-19 13:16:10

标签: bash csv awk sum cut

嗨,大家好,我有这个伪数据:

 id  | game_title     | demography    | store|sold(in k)| game_id|
+----+----------------+---------------+------+----------+--------+
|  3 | final fantasy  | 3             | QLD  | 5        | 115    |
|  4 | final fantasy  | 3             | NSW  | 3        | 115    |
|  5 | tekken         | 2             | QLD  | 2        | 101    |
|  6 | tekken         | 2             | QLD  | 1.5      | 101    |
|  7 | sfv            | 1             | NSW  | 1        | 100    |
|  8 | final fantasy  | 3             | QLD  | 2        | 115    |
|  9 | fifa           | 1             | QLD  | 12       | 102    |
+----+----------------+---------------+------+----------+--------+

所需的结果如下所示:

id   | game_title     | sold total in k|
+----+----------------+----------------|
|  3 | final fantasy  | 10             |   
|  4 | tekken         | 3.5            |    
|  5 | sfv            | 1              |     
|  6 | fifa           | 12             |      
+----+----------------+----------------+

由于某些标题确实具有相同的标题,所以将game_id用作组,我将如何使用bash做到这一点?

我可以使用

选择game_title,出售和game_id
awk -F "," '{print $2 $5 $6}' data.csv 

但是我不太确定如何进行汇总然后将其分组。

1 个答案:

答案 0 :(得分:1)

请您尝试以下。

解决方案第一个: :这将以与输入文件第二个字段相同的顺序输出。

awk '
BEGIN{
   FS="|"
   OFS="| "
}
FNR==1{
   print
   next
}
/--/ && !val{
   val=$0
   next
}
!c[$3]++{
   d[++count]=$3
}
{
   a[$3]+=$6
   if(!b[$3]){
     b[$3]=$2 OFS $3
   }
}
END{
   print val
   for(i=1;i<=count;i++){
      if(a[d[i]] && d[i]){
        print OFS b[d[i]],a[d[i]]
      }
   }
   print val
}'  Input_file

输出如下。

 id  | game_title     | demography    | store|sold(in k)| game_id|
+----+----------------+---------------+------+----------+--------+
|   3 |  final fantasy  | 10
|   5 |  tekken         | 3.5
|   7 |  sfv            | 1
|   9 |  fifa           | 12
+----+----------------+---------------+------+----------+--------+

解决方案2nd: :如果您不担心输出中第二列的顺序,则可以采取以下措施。

awk '
BEGIN{
   FS="|"
   OFS="| "
}
FNR==1{
   print
   next
}
/--/ && !val{
   val=$0
   next
}
{
   a[$3]+=$6
   if(!b[$3]){
     b[$3]=$2 OFS $3
   }
}
END{
   print val
   for(i in a){
     if(a[i] && b[i]){
       print OFS b[i],a[i]
     }
   }
   print val
}'   Input_file

输出如下。

 id  | game_title     | demography    | store|sold(in k)| game_id|
+----+----------------+---------------+------+----------+--------+
|   7 |  sfv            | 1
|   3 |  final fantasy  | 10
|   5 |  tekken         | 3.5
|   9 |  fifa           | 12
+----+----------------+---------------+------+----------+--------+