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 然后是一个键的大括号中的索引,或者紧接着是第二个键的值。具有第二类型键和值的行始终位于具有第一个键和索引的行之前。
我需要两个函数:
array()
: 将return数组设为{k:value1, l:value2}
.
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}
我需要处理如下所示的输出:
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 然后是一个键的大括号中的索引,或者紧接着是第二个键的值。具有第二类型键和值的行始终位于具有第一个键和索引的行之前。
我需要两个函数:
array()
: 将return数组设为{k:value1, l:value2}
.index(value)
到 return 前一行的索引值 所以index(value2)
returnsl
.
我看到 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}