AWK丢失数组操作数据

时间:2016-11-29 16:24:27

标签: bash shell awk

我正在编写一个小shell脚本来列出CSV文件中的数据。 我得到了以下代码,实际上主要是做这个工作:

awk 'BEGIN{FS=OFS=";"} {
    k = $7 FS $8 FS $14;
    if($4=="coll"){
        if($1=="2014")
            a[k] += $3
        else if($1=="2015")
            b[k] += $3
        else if($1=="2016")
            c[k] += $3}
    else{
        if($1=="2014")
            d[k] += $3
        else if($1=="2015")
            e[k] += $3
        else if($1=="2016")
            f[k] += $3}
        }
END {
    for (k in a) {
        print k FS a[k] FS d[k] FS b[k] FS e[k] FS c[k] FS f[k];
    }
}' $file1 > $file2

$ 4可以是两个值但可以在同一年使用多次,这就是为什么我使用带有k键的数组。字段$ 1是年份,但并非所有年份都有值,有时它们在$ 4上的“coll”值得到一个值,但对另一个值则没有。 3美元得到一个数值,我需要根据年份和$ 4字段值的具体总数,从那里所有这些if和else if语句。

我的所有记录都打印出来,直到我有2014年的东西。如果那个特定年份没有价值,我只是丢失了数据,即使2015年或/和2016年存在某些数据。

我不明白为什么,有人能告诉我光明吗?谢谢!

P.S。 :这是文件中的示例数据

2014;U;4;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2014;U;11;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2014;E;19;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2014;E;164;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;U;5;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;U;70;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;E;17;coll;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2015;E;205;adv;sector;activity;REGION1;1A;;;;;;CBS STRAS;;;;;;;;;;;;;
2016;R;3;adv;sector;activity;REGION1;1A;;;;;;IND RET ORG HAG BIS;;;;;;;;;;;;;x

1 个答案:

答案 0 :(得分:4)

你的循环说

for (k in a) {

所以你只会使用数组a[]中存在的键值,即填充为:

if($4=="coll"){
    if($1=="2014")
        a[k] += $3

更改

k = $7 FS $8 FS $14;
...
for (k in a) {

为:

k = $7 FS $8 FS $14;
keys[k]
...
for (k in keys) {

所以你创建并稍后循环包含所有数组的所有索引的新数组keys[]的索引。

实际上,你当然应该做这样的事情:

awk 'BEGIN{ FS=OFS=";" }
{
    k = $7 OFS $8 OFS $14
    keys[k]
    foo[$4]
    years[$1]
    a[k,$4,$1] += $3
}
END {
    for (k in keys) {
        printf "%s", k
        for (m in foo) {
            for (year in years) {
                printf "%s%s", OFS, a[k,m,year]
            }
        }
        print ""
    }
}'

或者甚至只是a[]上的简单循环,具体取决于您需要的输出格式。