如何在awk中保存变量名?

时间:2015-09-09 11:06:22

标签: awk

我需要编写一个脚本来计算表中五个最大的影响因素。

我有一个包含32列的表格。我需要计算每列的每个唯一项目的第32列的总和,然后得到五个最大的。

我有一个代码:

awk -f’;’ '{for(i=1;i<=29;i++)sums[$i]+=$32} END{for (i in sums) print sums[i], ":", i}' as.csv | sort -rn

这非常有效(每个唯一项目的第32列总和),但我无法确定哪个总和来自哪一列。

示例列:

Aircraft: Type;Altitude bin;Aircraft: Make/Model;Pilot notified;Damage type

示例输出:

4766 TRUE
4608 A-230
4560 Airplane
4556 Caused damage
3932 FALSE
3773 2

我想知道哪个值来自哪个列:

4766 TRUE - Pilot notified
4608 A-230 - Aircraft: Make/Model
4560 Airplane - Aircraft: Type
4556 Caused damage - Damage type
3932 FALSE - Pilot notified
3773 2 - Altitude bin

2 个答案:

答案 0 :(得分:0)

您只需要一个包含列名的数组。你可以用split来制作你的数组。这是一个简单的例子:

line="Aircraft: Type;Altitude bin;Aircraft: Make/Model;Pilot notified;Damage type"
split(line,array,";")
print array[1]

答案 1 :(得分:0)

由于您没有发布输入文件,我根据示例编写了这个。如果summand是最后一列,代码将按原样运行,否则将其更改为正确的索引。

示例数据(第一行具有列名)

Aircraft: Type;Altitude bin;Aircraft: Make/Model;Pilot notified;Damage type;Amount
Airplane;12;A-230;TRUE;Damage;100
Airplane;2;A-230;TRUE;Damage;100
Airplane;2;A-230;TRUE;Damage;100
Airplane;2;A-230;TRUE;Damage;100
Airplane;12;A-230;TRUE;Damage;100
Airplane;2;A-240;TRUE;Damage;100
Airplane;2;A-230;TRUE;Damage;100
Airplane;2;A-230;FALSE;Damage;100
Airplane;2;A-230;FALSE;Damage;100
Airplane;2;A-240;TRUE;Damage;100
Airplane;2;A-230;TRUE;Damage;100
Airplane;2;A-240;TRUE;Damage;100

代码是自我解释的

awk -F";" 'NR==1{for(i=1;i<=NF;i++)h[i]=$i;next} 
                {for(i=1;i<NF;i++)s[$i" - "h[i]]+=$NF} 
             END{for(v in s) print s[v], v}' filename

将输出

1200 Damage - Damage type
200 12 - Altitude bin
1000 TRUE - Pilot notified
200 FALSE - Pilot notified
1000 2 - Altitude bin
900 A-230 - Aircraft: Make/Model
1200 Airplane - Aircraft: Type
300 A-240 - Aircraft: Make/Model

管道如前所述进行排序以获得最终结果。