我有一个名为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}'
但结果是一堆新行。
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
$ awk -F'[:,]' -v OFS=',' '{print $2,$6}' file
Jane,cat
John,dog
Jake,dog
至于为什么你的尝试不起作用,主要是因为正则表达式上下文中的[
和]
是“括号表达式”分隔符,而内部的是一组字符(可以是单个字符,范围,列表和/或类)所以当你写下:
-F'['petOwner''petName''petType']'
会将FS
设置为字符集p
,e
,t
等,而不是字符串集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 将输出字段分隔符设置为逗号。