为什么不是';这个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