1

我想在 unix 中对 csv 文件运行拆分并在某些列上运行聚合。如果可能的话,我想在使用 awk 的每个拆分文件上按几列分组。

有谁知道一些可以做到这一点的unix魔法?

这是一个示例文件:

customer_id,location,house_hold_type,employed,income
123,Florida,Head,true,100000
124,NJ,NoHead,false,0
125,Florida,NoHead,true,120000
126,Florida,Head,true,72000
127,NJ,Head,false,0

我想按条件获取同一组的位置、house_hold_type 以及 AVG(income) 分组的计数。

如何拆分文件并使用它运行 awk?

这是我期望输出格式可能不同的输出,但这是我期望的整体数据结构。将虚心接受其他呈现信息的方式:

location:[counts:['Florida':3, 'NJ':2], income_avgs:['Florida':97333, 'NJ':0]]
house_hold_type:[counts:['Head':3, 'NoHead':2], income_avgs:['Head':57333, 'NoHead':60000]]

先感谢您。

4

1 回答 1

1

awk 最适合处理数据列,因此输入格式很好。可以管理输出格式,但在列中输出也会更简单:

#set the input and output field separators to comma
BEGIN {
    FS = ",";
    OFS = FS;
}

#skip the header row
NR == 1 {
    next;
}

#for all remaining rows, store counters and sums for each group
{
    count[$2,$3]++;
    sum[$2,$3] += $5;
}

#after all data, display the aggregates
END {
    print "location", "house_hold_type", "count", "avg_income";
    #for every key we encountered
    for(i in count) {
        #split the key back into "location" and "house_hold_type"
        split(i,a,SUBSEP);
        print a[1], a[2], count[i], sum[i] / count[i];
    }
}

样本输入:

customer_id,location,house_hold_type,employed,income
123,Florida,Head,true,100000
124,NJ,NoHead,false,0
125,Florida,NoHead,true,120000
126,Florida,Head,true,72000
127,NJ,Head,false,0

和输出:

location,house_hold_type,count,avg_income
Florida,Head,2,86000
Florida,NoHead,1,120000
NJ,NoHead,1,0
NJ,Head,1,0
于 2014-05-08T21:28:32.243 回答