-1

在 awk 中,我该怎么做:

1303361997;15;67.067014
1303361997;5;51.529837
1303361997;14;47.036197
1303361997;3;44.064681
1303361997;6;37.632831
1303361997;23;24.990078
1303361997;24;26.750984
1303361998;15;67.074100
1303361998;5;51.522981
1303361998;14;47.028185
1303361998;3;44.056715
1303361998;6;37.638584
1303361998;23;24.987800
1303361998;24;26.756648

当第二列中的数字不存在时,此日期应在输出文件中替换为零。第一位是第一列的编号。第二列数据的值决定了第三列在输出文件中的位置。第一列每次可能以不同的值开头。期望的输出,通过对第一列和第二列进行排序:

1303361997;0;0;44.064681;0;51.529837;37.632831;0;0;0;0;0;0;0;47.036197;67.067014;0;0;0;0;0;0;0;24.990078;26.750984;
1303361998;0;0;44.056715;0;51.522981;37.638584;0;0;0;0;0;0;0;47.028185;67.074100;0;0;0;0;0;0;0;24.987800;26.756648;
4

1 回答 1

1
$ cat tst.awk
BEGIN { FS=";" }
NR == 1 {
    for (i=1;i<=2;i++) {
        min[i] = max[i] = $i
    }
}
{
    val[$1,$2] = $3
    keys[$1]
    for (i=1;i<=2;i++) {
        min[i] = ($i < min[i] ? $i : min[i])
        max[i] = ($i > max[i] ? $i : max[i])
    }
}
END {
    for (r=min[1];r<=max[1];r++) {
        if (r in keys) {
            printf "%d",r
            for (c=1;c<=max[2];c++) {
                printf ";%s", ((r,c) in val ? val[r,c] : 0)
            }
            print ";"
        }
    }
}
$
$ cat file
1303361997;15;67.067014
1303361997;5;51.529837
1303361997;14;47.036197
1303361997;3;44.064681
1303361997;6;37.632831
1303361997;23;24.990078
1303361997;24;26.750984
1303361998;15;67.074100
1303361998;5;51.522981
1303361998;14;47.028185
1303361998;3;44.056715
1303361998;6;37.638584
1303361998;23;24.987800
1303361998;24;26.756648
$
$ awk -f tst.awk file
1303361997;0;0;44.064681;0;51.529837;37.632831;0;0;0;0;0;0;0;47.036197;67.067014;0;0;0;0;0;0;0;24.990078;26.750984;
1303361998;0;0;44.056715;0;51.522981;37.638584;0;0;0;0;0;0;0;47.028185;67.074100;0;0;0;0;0;0;0;24.987800;26.756648;
于 2013-10-07T16:13:18.660 回答