2

我有很多文件,都具有相同的行数,在第 1 列中都具有相同的值(我想保留)。问题是输出改变了顺序。

cat file1.dat
Sep-12 1082
Oct-12 1377
Nov-12 1095
Dec-12 888
Jan-13 1184
Feb-13 1036
Mar-13 895
Apr-13 1207
May-13 1325
Jun-13 1147
Jul-13 1256
Aug-13 1362
Sep-13 1260

cat file2.dat
Sep-12 5185
Oct-12 5707
Nov-12 5427
Dec-12 3321
Jan-13 8093
Feb-13 6000
Mar-13 6348
Apr-13 6921
May-13 6959
Jun-13 6246
Jul-13 6634
Aug-13 6704
Sep-13 6350

.....etc

当我跑步时

awk '{a[$1]+=$2}END{for (k in a) print k,a[k]}' dat_files/*.dat

我明白了

May-13 20086
Nov-12 16175
Jun-13 74138
Mar-13 16598
Jan-13 18293
Aug-13 21853
Feb-13 14831
Jul-13 20614
Sep-12 12480
Sep-13 20717
Oct-12 14099
Apr-13 23954
Dec-12 11469

这似乎没有特定的顺序(而不是我想要的)。我希望输出与所有 .dat 文件的顺序相同,即以

Sep-12 (total)
Oct-12 (total)
Nov-12 (total)
etc...

我以为 awk 按顺序读取每个文件中的数据...?任何帮助,将不胜感激。谢谢!

4

3 回答 3

4

关联数组不保留键插入顺序。在大多数语言中都是如此。

您可以将列名顺序存储在另一个数组中并使用它来打印结果。

awk '
    {
        s[FNR] += $2
        c[FNR] = $1
    }

    END {
        for (i=1; i <= FNR; i++)
            print c[i], s[i]
    }
' dat_files/*.dat
于 2013-10-08T17:23:57.870 回答
1

您可以简单地sort输出如下:

awk '{a[$1]+=$2}END{for (k in a) print k,a[k]}' dat_files/*.dat | sort --key=1.5,1.6 --key=1.1,1.3M

这将首先按每行的第 5-6 个字符(即年份)排序,然后按每行的第 1-3 个字符(即月份)排序。该M参数告诉 sort 按月份JanFeb等,而不是数字进行排序。

于 2013-10-08T17:32:22.257 回答
0

在你得到总数之后,说,你命名它all.dat。然后你可以尝试以下

awk 'BEGIN {j = 0} { if (content[$1] != "" ) { content2[j $1] = $0 ; j++ ; } else { content[$1] = $0 ; }  } END { for ( i in content2 ) print i, content2[i] ; } ' file1.dat all.dat 
| sort 
| awk '{ $1="" ; print ; }'

此脚本添加一个人工列,sort然后将其删除。

于 2013-10-08T17:17:58.363 回答