使用awk分割具有多个字符串分隔符的行

时间:2017-08-07 17:49:06

标签: bash awk

我有一个名为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 个答案:

答案 0 :(得分:3)

$ 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设置为一组字符串(实际上是regexp,因此请注意metachars)将是:

-F'petOwner|petName|petType'

答案 1 :(得分:3)

你也可以用这种形式而不是char set

来编写分隔符
$ awk -F'pet(Owner|Name|Type):' '{print $2,$4}' file

Jane, cat
John, dog

Jake, dog

答案 2 :(得分:0)

您还可以定义字段的内容,而不是定义分隔符的内容。为此,您使用 FPAT 变量,如下所示:

Settings | Inspections -- there is "Reset To Default" tool button (Ctrl+R is default shortcut on Windows)

这样您就可以将所有不是逗号冒号的内容定义为字段。

有时它会使程序更容易。

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