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;iawk-F'|'-vofs=,'
{
key23=key56=“”
对于(i=3;iYes,awk
可以是此任务的正确工具
使用GNUawk
设置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
可以是此任务的正确工具
使用GNUawk
设置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