awk解析输出和提取值

时间:2015-02-22 14:32:46

标签: linux bash shell unix awk

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

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

行始终以两个键中的一个键开头,后跟:,然后是空格,然后是一个键的花括号索引,或者第二个键的值。带有第二个键的行和值的前面总是带有第一个键和索引的行。

我需要两个功能:

  1. array():将数组作为{k:value1, l:value2}返回。
  2. index(value)返回上一行的索引值,以便index(value2)返回l
  3. 我看到返回行号等的示例,但我的awk级别为0。

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

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

1 个答案:

答案 0 :(得分:3)

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

*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=$2}
/^my_second_key:/ {
  sub(/^my_second_key: */, "") # leaves only value2 in $0
  if (first_done==0) {
    buffer["index1"]=ix
    buffer["value1"]= $0
    first_done=1
  }
  else { # first_done == 1
    printf ("{%s:%s, %s:%s}\n", buffer["index1"], buffer["value1"], ix, $0)
    first_done=0
  }
}

,输出为:

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