2017-08-07 65 views
3

我有一个名为pet_owners.txt看起来像:使用awk来与多个字符串分割线定界符

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
$ awk -F'[:,]' -v OFS=',' '{print $2,$6}' file 
Jane,cat 
John,dog 
Jake,dog 

至于为什么你尝试不工作,主要是因为[和正则表达式的情况下]是“括号表达式”分隔符和发生的事情里面是一组字符(可能是单个字符,范围,列表和/或类),所以当你说:

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

,将设置FS的字符集pet等不设定弦petOwner等的。多个int ernal ' s正在相互取消,因为你没有理由跳入/退出shell,因为如果没有元字符,那么shell将会扩展,就像你写了-F'[petOwnerpetNamepetType]'一样。

要设置FS到一组字符串(实际上正则表达式所以,要当心metachars)将是:

-F'petOwner|petName|petType' 
1

,你也可以写分隔符以这种形式,而不是字符集

$ 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将输出字段分隔符设置为逗号。

+0

你应该提到FPAT是只有gawk的。 –