awk 解析输出并提取值

awk parsing output and extracting values

我需要处理如下所示的输出:

my_first_key: {i}text
my_first_key: {j}different_text
my_first_key: {k}some_text
my_second_key: value1
my_first_key: {l}some_text
my_second_key: value2

行总是以两个键之一开头,后跟 : 然后是 space 然后是一个键的大括号中的索引,或者紧接着是第二个键的值。具有第二类型键和值的行始终位于具有第一个键和索引的行之前。

我需要两个函数:

  1. array(): 将return数组设为{k:value1, l:value2}.
  2. index(value) 到 return 前一行的索引值 所以 index(value2) returns l.

我看到 return 行号等示例,但我的 awk 级别是 0。

[来自Moshe评论]算法是这样的:

a) awk '/$value/{ print NR; exit }'
b) awk 'NR==$(previous_return - 1)
c) awk '{split([=11=],a,"{}") | print a[2]

我现在没有太多时间,但下面的程序应该可以帮助你解决第一点。它严格基于您的示例。根据您的示例输入,我将字母索引 i、j、k 和 l 替换为 1、2、3、4,因此测试文件包含:

*my_first_key: {1}text
my_first_key: {2}different_text
my_first_key: {3}some_text
my_second_key: value1
my_first_key: {4}some_text
my_second_key: value2*

程序是:

BEGIN {
  # split on braces to have the index from my_first_key: in field #2 without effort
  FS="[{}]"
}
/^my_first_key:/ { ix=}
/^my_second_key:/ {
  sub(/^my_second_key: */, "") # leaves only value2 in [=11=]
  if (first_done==0) {
    buffer["index1"]=ix
    buffer["value1"]= [=11=]
    first_done=1
  }
  else { # first_done == 1
    printf ("{%s:%s, %s:%s}\n", buffer["index1"], buffer["value1"], ix, [=11=])
    first_done=0
  }
}

输出为:

awk -f example.awk test.data
{3:value1, 4:value2}