每行的awk阵列初始化失败

每行的awk阵列初始化失败,awk,Awk,我有一个日志文件,其中每行包含一些由,分隔的数字。我只是想对每个号码进行一些操作。用awk似乎很容易,但不知怎的,我被卡住了。我用来分割每一行的数组在第一行只初始化了一次。在那之后,阵列就不清晰了。split应该先清除数组,然后使用它,我甚至使用了删除数组。但问题依然存在。任何帮助都将不胜感激。 下面是一些例子; 这是一个示例文件 [[bash_prompt$]]$ cat log 1,2,3 2 9 1,4 5,7 7 8 6,2 这就是我得到的 [[bash_prompt$]]$ awk

我有一个日志文件,其中每行包含一些由
分隔的数字。我只是想对每个号码进行一些操作。用awk似乎很容易,但不知怎的,我被卡住了。我用来分割每一行的数组在第一行只初始化了一次。在那之后,阵列就不清晰了。split应该先清除数组,然后使用它,我甚至使用了
删除数组
。但问题依然存在。任何帮助都将不胜感激。
下面是一些例子; 这是一个示例文件

[[bash_prompt$]]$ cat log
1,2,3
2
9
1,4
5,7
7
8
6,2
这就是我得到的

[[bash_prompt$]]$ awk '{print "New Line " $1; delete a; split($1,a,","); for(var in a){ print "Array Element " var; } }' log
New Line 1,2,3
Array Element 1
Array Element 2
Array Element 3
New Line 2
Array Element 1
New Line 9
Array Element 1
New Line 1,4
Array Element 1
Array Element 2
New Line 5,7
Array Element 1
Array Element 2
New Line 7
Array Element 1
New Line 8
Array Element 1
New Line 6,2
Array Element 1
Array Element 2
但以下是我所期待的

[[bash_prompt$]]$ awk '{print "New Line " $1; delete a; split($1,a,","); for(var in a){ print "Array Element " var; } }' log
New Line 1,2,3
Array Element 1
Array Element 2
Array Element 3
New Line 2
Array Element 2
New Line 9
Array Element 9
New Line 1,4
Array Element 1
Array Element 4
New Line 5,7
Array Element 5
Array Element 7
New Line 7
Array Element 7
New Line 8
Array Element 8
New Line 6,2
Array Element 6
Array Element 2
我的是GNU Awk 3.1.5。我还发现了另一种方法,使用shell和awk的组合(在每行上分别运行awk),但我想知道我做错了什么

for(数组中的var)
将var设置为数组下一个元素的索引,因此
var
是索引,而不是内容。使用

print "Array Element " a[var]

您不需要使用
split()
只需设置字段分隔符:

awk -F, '{print "New Line",$0;for(i=1;i<=NF;i++)print "Array Element",$i}' log
New Line 1,2,3
Array Element 1
Array Element 2
Array Element 3
New Line 2
Array Element 2
New Line 9
Array Element 9
New Line 1,4
Array Element 1
Array Element 4
New Line 5,7
Array Element 5
Array Element 7
New Line 7
Array Element 7
New Line 8
Array Element 8
New Line 6,2
Array Element 6
Array Element 2

awk-F,'{打印“新行”,0美元;用于(i=1;i您想要的输出是什么?当我得到
新行5,7
时,接下来的两行应该打印5和7,但是它打印的是1,2,它在开始时被馈送到数组。我的意思是一个完整的输出。使用它可以更容易地检查不正确的内容。我已经更新了问题。正如您所看到的,数组元素拆分调用后不会更新ts。我将为每个数组元素添加进一步的处理。因此,我不是在要求打印,我是在查找我在将每行拆分为一个数组时犯了什么错误。或者为什么在每次拆分调用后都不更新数组。parkydr发现了问题,我在中检查了索引值不要使用索引。谢谢GuysAhhh,,愚蠢的我:P,我已经研究了这么长时间,但没有看到这个。非常感谢@parkydr。实际上我还有进一步的处理要做,对于每个元素,我将在数组中多次迭代,所以对我来说,将它们保留在数组中是很重要的。你所做的一切都是使用
split()
awk
已经对字段执行的操作,您在每个记录之后都要删除数组。您对数组
a[var]做了哪些进一步的处理
可以用
$i
完成。几乎可以肯定,您不必要地处理字段分隔。在日志中,我得到了请求的id。1行1个会话,id按照请求的顺序。我必须检查每个会话,如果一个id请求了多次,以及请求了多少次。因此,我实际上是将它们放到另一个ar最后,为了安全起见,我检查了是否有任何胭脂id在每次会话中都会重复请求,并且都是在一个目录中,而没有写入权限.事实上,我需要检查一行中是否有一个id出现多次,如果是,有多少次。当时awk数组似乎是一个不错的方法。现在我想知道是否有更好的解决方案。有什么建议吗…@abasu对于您描述的情况,我会使用一个数组,其中键是id,值是计数,但我不会手动适当地拆分我设置的
FS
字段。最初,我从
FS=“,”
开始,然后将它们存储为
array[id]+
。但一个问题立即出现,一些id几乎会在每个会话中请求(这是有效的).但随着会话数量的增加,这些id的数量也在增加。最终,我有了一个列表,其中有胭脂id,但也有有效的id。要解决这个问题,我必须采取这种方法。我还必须设置一个截止线,使会话中的最小请求数符合胭脂id的条件。