使用awk分割包含多个字符串分隔符的行

5

我有一个名为pet_owners.txt的文件,内容如下:

petOwner:Jane,petName:Fluffy,petType:cat
petOwner:John,petName:Oreo,petType:dog
...
petOwner:Jake,petName:Lucky,petType:dog

我想使用awk根据分隔符'petOwner', 'petName'和'petType'来拆分文件,以便提取宠物主人和宠物类型。我的期望输出如下:
Jane,cat
John,dog
...
Jake,dog

到目前为止,我尝试过:

awk < pet_owners.txt -F'['petOwner''petName''petType']' '{print $1 $3}'

但结果是一堆换行符。

有什么办法可以实现这个目标吗?

3个回答

6
$ awk -F'[:,]' -v OFS=',' '{print $2,$6}' file
Jane,cat
John,dog
Jake,dog

关于为什么您的尝试没有成功,主要是因为在正则表达式的上下文中,[] 是"括号表达式"的分隔符,里面放的是一组字符(可以是单个字符、范围、列表和/或类别)。因此,当您写下以下内容时:

-F'['petOwner''petName''petType']'

这会将FS设置为字符集pet等,而不是字符串集合petOwner等。多个内部的'是在跳入/跳出 shell 时无缘无故地互相抵消,就好像您写了-F'[petOwnerpetNamepetType]'一样,因为其中没有元字符需要 shell 扩展。

要将 FS 设置为一组字符串(实际上是正则表达式,因此请注意元字符),应该使用以下命令:

-F'petOwner|petName|petType'

4
您可以使用此格式编写分隔符,而不是字符集。
$ awk -F'pet(Owner|Name|Type):' '{print $2,$4}' file

Jane, cat
John, dog

Jake, dog

0

你也可以定义一个字段是什么,而不是定义分隔符是什么。为此,您可以使用FPAT变量,如下所示:

~ $ awk '{ print $2,$6 }' FPAT="[^,:]+" OFS="," pet_owners.txt
Jane,cat
John,dog

这样,您将定义除了逗号冒号之外的所有内容作为字段。

有时这会使程序更容易。

OFS将输出字段分隔符设置为逗号。


1
你应该提到FPAT只适用于gawk。 - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接