【问题标题】:awk array initialization at each line fails每行的 awk 数组初始化失败
【发布时间】:2013-04-27 18:58:52
【问题描述】:

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

[[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),但我想知道我做错了什么

【问题讨论】:

  • 你想要的输出是什么?
  • 当我得到 New Line 5,7 时,接下来的 2 行应该打印 5 和 7,但它打印的是 1,2,它在开始时被输入到数组中。
  • 我的意思是完整的输出。使用它来检查不正确的地方会更容易
  • 我已经更新了这个问题。如您所见,数组元素在拆分调用后没有得到更新。我将为每个数组元素添加进一步的处理。所以只是打印不是我要问的,我正在寻找我在将每一行分成一个数组时犯了什么错误。或者为什么每次拆分调用后数组没有更新。
  • parkydr 发现了问题,我是在检查索引值,而不是使用索引。谢谢各位

标签: awk


【解决方案1】:

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

print "Array Element " a[var]

【讨论】:

  • 啊,我傻了:P,我研究了这么久,没有看到这个。非常感谢@parkydr。
【解决方案2】:

你不需要使用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

【讨论】:

  • 其实我有进一步的处理来做每个元素的位置,我会多次迭代数组,所以对我来说,将它们保存在数组中很重要。
  • 您对split() 所做的一切都是awk 已经对字段所做的,无论如何您都在删除每条记录之后的数组。您对数组a[var] 所做的任何进一步处理都可以通过$i 完成。您几乎可以肯定地处理了不必要的字段分离。
  • 在日志中,我正在获取请求的 ID。 1 行中的 1 个会话,ID 遵循请求的顺序。我必须检查每个会话,如果一个 id 请求多次以及请求多少次。所以我实际上是把它们放到另一个数组中。最后,我正在检查任何在每个会话中重复请求的 rouge id,并且所有这些都在没有写权限的目录中(为了安全起见)。实际上,我需要检查一行中是否存在一个 id 多次,如果是,则存在多少次。那个时候 awk 数组似乎是一个不错的方法。现在我很好奇是否有更好的解决方案。任何建议...
  • @abasu 对于您描述的情况,我将使用一个数组,其中键是 ID,值是计数,但是我不会手动拆分我适当设置 FS 的字段。
  • 最初我从FS = "," 开始,然后将它们存储为array[id]++。但是马上就出现了一个问题,几乎在每个会话中都会请求一些 id(这是有效的)。但是随着会话数量的增加,这些 id 的数量也在增加。最终,我得到了一个存在 rouge id 的列表,但也存在有效的 id。为了解决这个问题,我不得不采取这种方法。我还必须为会话中的最小请求数设置一个截止值才能成为 rouge id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2016-03-25
  • 2012-11-17
  • 2017-12-10
相关资源
最近更新 更多