为什么不是';这个awk脚本是否按预期运行?

为什么不是';这个awk脚本是否按预期运行?,awk,gawk,Awk,Gawk,我有以下测试脚本 /^[^a-zA-Z0-9]/ { DATEd[$3] = $1 } END { print " \"data\": [" for (i = 0 ; i <= 5; i ++ ) { { print " [" i ", \"" DATEd[i] "\"],"} } print " ]" } 但它没有打印出

我有以下测试脚本

 /^[^a-zA-Z0-9]/  {
    DATEd[$3] = $1
    } 
   END { 
        print "        \"data\": ["
        for (i = 0 ; i <= 5; i ++ ) {
            { print "            [" i ", \"" DATEd[i] "\"],"}
        }
        print "        ]"
}
但它没有打印出我想要的,我想要打印出来

    "data": [
        [0, "2011-01-22"],
        [1, "2011-01-22"],
        [2, "2011-01-22"],
        [3, "2011-01-22"],
        [4, "2011-01-22"],
        [5, "2011-01-22"],
    ]
当它实际上只是打印出来的时候

"data": [
    [0, ""],
    [1, ""],
    [2, ""],
    [3, ""],
    [4, ""],
    [5, ""],
]
那么为什么“日期[$3]=$1”是空的呢

另外,如何检查数组的长度? 在这种情况下,DATEd.length不起作用

谢谢

编辑

在弗雷德里克和吉科索的帮助下,我终于找到了答案,现在是最后几个问题

1) 脚本现在看起来像这样

 /[a-zA-Z0-9]/  {
    DATEd[NR-1] = $1
    } 
   END { 
        print "        \"data\": ["

        for (i in DATEd) {
            { print "            [" i ", \"" DATEd[i] "\"],"}
        }
        print "        ]"
}
"data": [
[0, "2011-01-22"],
[1, "2011-01-23"],
[2, "2011-01-24"],
[3, "2011-01-25"],
[4, "2011-01-26"],
[5, "2011-01-27"],
[6, "2011-01-28"]
]
并给出以下输出

"data": [
    [4, "2011-01-26"],
    [5, "2011-01-27"],
    [6, "2011-01-28"],
    [0, "2011-01-22"],
    [1, "2011-01-23"],
    [2, "2011-01-24"],
    [3, "2011-01-25"],
]
但我希望它看起来像这样

 /[a-zA-Z0-9]/  {
    DATEd[NR-1] = $1
    } 
   END { 
        print "        \"data\": ["

        for (i in DATEd) {
            { print "            [" i ", \"" DATEd[i] "\"],"}
        }
        print "        ]"
}
"data": [
[0, "2011-01-22"],
[1, "2011-01-23"],
[2, "2011-01-24"],
[3, "2011-01-25"],
[4, "2011-01-26"],
[5, "2011-01-27"],
[6, "2011-01-28"]
]
也就是说,要排序并删除最后一个“,”字符(在最后一个结束“]”字符之前)。这是否可能以一种简单的方式进行访问?=)

谢谢=)

编辑3个最终结果

使用@geekosaur和@Fredrik contribution's=)的组合

{
日期[NR-1]=1美元;len++
}
结束{
打印“\”数据\“:[”
#(i在日期中){

对于(i=0;i作为开始,您的正则表达式是错误的,
/^[^a-zA-Z0-9]/
表示匹配行的开头,后面没有字母或数字。没有一行具有该设置,因此,您的数组
DATe
为空

其次,数组的索引不是0-5,而是$3的内容(如果修复正则表达式)

没有内置函数来获取数组的长度,但是实现一个很简单

数组示例

function array_length(a) {
    for (i in a) n++
    return n
}

{
    DATEd[NR] = $1
}
END {
    for (i in DATEd) {
        print i, DATEd[i]
    }
    print "Number of items", array_length(DATEd)

    # copy indices
    j = 1
    for (i in DATEd) {
        ind[j] = i    # index value becomes element value
        j++
    }
    n = asort(ind)    # index values are now sorted
    for (i = 1; i <= n; i++)
        print i, DATEd[ind[i]]
}
有关阵列的说明,请参见

在数组的所有元素中循环,请使用此构造(请参见上面的链接)


在缺少
-F
选项的情况下,
$3
将是
P16A22_110114072915
(或者如果您的选择器regex是正确的,则会是)。您实际希望那里有什么值?您可能想要
NR


awk
不是面向对象的;而且它的数组支持也缺乏。你需要自己跟踪数组的长度。(只是想让你知道
awk
的数组支持有多有限:你不能分配数组。你必须分配单个索引或使用
split()

@Fredrik我知道它没有索引到5,只是好奇它是否包含任何内容。但我现在已经修复了它,但它仍然不起作用,现在是这样的/[a-zA-Z0-9]/,这一定行吗?@erik查看@geekosaur的答案您正在使用第三个字段(即
P16A22_110114072915
对数组进行索引,这是有意的吗?非常有效,还有一个问题,是否有一种方法可以删除最后一个“,”,例如检查$1的长度,如果是相同的,请使用特例printf“[%d,%s]\n”,NR-1,$1?=)@erik你能用上面的内容更新你的问题吗,包括预期的输出吗?我不太明白:-)@Fredrik非常感谢你的帮助:DYeah这是一个问题:D另一个问题,现在是另一个问题,我如何跟踪这个数组的长度,就像现在的[NR-1]=$1=)您可以在
END
块中引用
NR
,或者只保留一个计数器:
DATEd[NR-1]=$1;len++
然后在END块中使用
len
。或者,您可以对i in DATEd
块使用
,但结果将是“随机”排序的。(Awk实际上没有数组,它有散列/指令。
for
按散列值排序。)
4 2011-01-22
5 2011-01-22
6 2011-01-22
1 2011-01-22
2 2011-01-22
3 2011-01-22
Number of items 6
1 2011-01-22
2 2011-01-22
3 2011-01-22
4 2011-01-22
5 2011-01-22
6 2011-01-22
 for (var in array)
   body