嗨,大家好,我有这个伪数据:
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_idawk -F "," '{print $2 $5 $6}' data.csv
但是我不太确定如何进行汇总然后将其分组。
答案 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
+----+----------------+---------------+------+----------+--------+