2017-08-07 64 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的。 –