Awk 使用变量字段文件格式解析符号分隔的文件,格式为key=value的变量字段

Awk 使用变量字段文件格式解析符号分隔的文件,格式为key=value的变量字段,awk,Awk,我有一个包含以下格式记录的文件: foo10|bar11|baz15|key1.1=10|key23.1=12.2|key56.2=21|key876.2=242 foo11|bar21|baz34|key56.2=25.45|key1.1=11|key23.1=11.2|key56.2=21|key876.2=242 foo13|bar13|baz16|key591=123|key1.1=11|key23.1=12.2|key876.2=242 foo23|bar34|baz16|key591

我有一个包含以下格式记录的文件:

foo10|bar11|baz15|key1.1=10|key23.1=12.2|key56.2=21|key876.2=242
foo11|bar21|baz34|key56.2=25.45|key1.1=11|key23.1=11.2|key56.2=21|key876.2=242
foo13|bar13|baz16|key591=123|key1.1=11|key23.1=12.2|key876.2=242
foo23|bar34|baz16|key591=123|key23.1=1232.2|key56.2=532
我想提取第一个和第二个字段,并找到key23.1和key56.2。 键的长度可变,可以按任何顺序排列,也可以存在或不存在

有了这些,我会得到如下结果:

foo10,bar11,12.2,21
foo11,bar21,11,25.45
foo13,bar13,11,
foo23,bar34,,532
由于这是两个级别(比如我们有一个|分离的记录,然后一些记录有
keyX.Y=
),awk是这个任务的正确工具吗?

awk-F'|'-v OFS=,'
awk -F'|' -v OFS=, '
    { 
        key23 = key56 = ""
        for (i = 3; i <= NF; ++i)
            if ($i ~ /^key23\.1=/)
                key23 = substr($i, 9)
            else if ($i ~ /^key56\.2=/)
                key56 = substr($i, 9)
        print $1, $2, key23, key56
    }'
{ key23=key56=“” 对于(i=3;i
awk-F'|'-vofs=,'
{ 
key23=key56=“”

对于(i=3;iYes,
awk
可以是此任务的正确工具

使用GNU
awk
设置FS multicharacter,在这里
FS=“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=”
我们可以得到所需的输出:

awk -v FS="\\\||=" '
    NR==1{print $1, $2, $7, $9}
    NR==2{print $1, $2, $7, $5}
    NR==3{print $1, $2, $7}
    NR==4{print $1, $2, $9}' OFS="," file
foo10,bar11,12.2,21
foo11,bar21,11,25.45
foo13,bar13,11
foo23,bar34,532

是的,
awk
可以是此任务的正确工具

使用GNU
awk
设置FS multicharacter,在这里
FS=“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=”
我们可以得到所需的输出:

awk -v FS="\\\||=" '
    NR==1{print $1, $2, $7, $9}
    NR==2{print $1, $2, $7, $5}
    NR==3{print $1, $2, $7}
    NR==4{print $1, $2, $9}' OFS="," file
foo10,bar11,12.2,21
foo11,bar21,11,25.45
foo13,bar13,11
foo23,bar34,532