2011-06-29 48 views
1

我有以下的测试脚本这个awk脚本为什么不像预期的那样工作?

/^[^a-zA-Z0-9]/ { 
    DATEd[$3] = $1 
    } 
    END { 
     print "  \"data\": [" 
     for (i = 0 ; i <= 5; i ++) { 
      { print "   [" i ", \"" DATEd[i] "\"],"} 
     } 
     print "  ]" 
} 

而从这个文本文件阅读

2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 
2011-01-22 22:12 P16A22_110114072915 22 1312 75 13.55 1399 

但它不会打印出我希望它,我希望它打印出来

"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, ""], 
] 

那么为什么“DATEd [$ 3] = $ 1”是空的?

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

感谢

EDIT_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ___

所以从@Fredrik的帮助和@geekosaur我与这个地方来,现在一些最后的问题

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

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

     for (i in DATEd) { 
      { print "   [" i ", \"" DATEd[i] "\"],"} 
     } 
     print "  ]" 
} 

,并给出了下面的输出

"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"], 
] 

但我希望它看起来像这样

"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"] 
] 

即进行排序,并最终收盘‘]’字符之前删除最后一个“”字符。这可能以简单的方式获得吗?=)

感谢=)

EDIT 3最终Outcome_ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ ____

使用@geekosaur和@Fredrik贡献的=)

{ 
    DATEd[NR-1] = $1; len++ 
} 
    END { 
     print "  \"data\": [" 

     #for (i in DATEd) { 
     for (i = 0 ; i <= len-1; i ++) { 
      { print "   [" i ", \"" DATEd[i] "\"],"} 
     } 
     print "  ]" 
} 

回答

0

的组合作为开始,你的正则表达式是错误的,/^[^a-zA-Z0-9]/意味着匹配行的开始和NOT随后是一封信或一个号码。没有任何行具有该设置,因此,您的数组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]] 
} 

给出:

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 

数组

太循环通过数组的所有元素时,使用该构建体(见上面的链接的说明,请参见gnu awk manual

for (var in array) 
    body 
+0

@Fredrik我知道它没有索引到5,只是好奇,看看它是否包含任何东西。但我现在已经修好了,但它仍然不起作用,现在就是这样/ [a-zA-Z0-9] /,而且必须工作? – erik

+0

@erik请参阅@geekosaur的答案,您正在使用第三个字段为您的数组编制索引,即“P16A22_110114072915”是这个意思吗? –

+0

相当有效,还有一个问题,有没有一种方法可能会删除最后一个',',比如检查$ 1的长度,如果它相同,则有一个特殊情况printf“[%d,%s] \ n” ,NR-1,$ 1? =) – erik

0

如果没有-F选项,$3将是P16A22_110114072915(或者,如果您的选择器正则表达式正确的话)。你真的想要什么价值?你是否想要NR

awk不是面向对象的;并且它的阵列支持是仁慈的,缺乏。你需要自己跟踪数组的长度。 (只是为了让你知道如何有限的awk的阵列支持是:你不能分配一个数组,你必须分配单独的索引或使用split()。)

+0

是的,就是那个:D另一个问题,现在到另一个问题,我该如何跟踪这个数组的长度,现在是这样的:DATEd [NR-1] = $ 1 =) – erik

+0

你可以在'END'块中引用'NR',或者只保留一个计数器:'DATEd [NR-1] = $ 1; len ++',然后在END块中使用'len'。或者,您可以在DATEd块中使用'for i,但结果将会“随机”排序。 (awk没有真正的数组,它有散列/字典。''''''''按散列值排序。) – geekosaur

+0

感谢您的帮助=) – erik

相关问题