2015-02-06 90 views
0

這是我的問題:我有一個xml文件太重(60 MB),所以我想要檢索特定標記之間的文本。使用AWK檢索特定XML標記之間的文本

我的XML是這樣的:所以我會檢索屬於PrimaryCategory標籤,其中PrimaryCategoryID = 3

<PrimaryCategory> 
    <PrimaryCategoryID>3</PrimaryCategoryID> 
    <PrimaryCategoryName>Billets de concert</PrimaryCategoryName> 
    <PrimaryCategoryURL>http://www.viagogo.fr/Billets-de-concert</PrimaryCategoryURL> 
    <CategoryList> 
     <CategoryID>13632</CategoryID> 
     <CategoryName>Ron Sexsmith</CategoryName> 
     <CategoryURL>http://www.viagogo.fr/Billets-de-concert/Pop-Rock/Ron-Sexsmith-Billets</CategoryURL> 
     <CategoryImageURL>http://cdn1.viagogo.net/img/cat/1207/2/1.jpg</CategoryImageURL> 
     <CategoryDescription /> 
    </CategoryList> 
    <CategoryList> 
     <CategoryID>27605</CategoryID> 
     <CategoryName>Theme Park</CategoryName> 
     <CategoryURL>http://www.blalbalbla.com</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
    </CategoryList> 
    <CategoryList> 
     <CategoryID>21935</CategoryID> 
     <CategoryName>Idina Menzel</CategoryName> 
     <CategoryURL>http://www.blalbalbla.com</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
     <EventList> 
     <EventID>740520</EventID> 
     <EventName>Idina Menzel</EventName> 
     <EventDate>2015-06-26T20:00:00</EventDate> 
     <EventURL>http://www.blalbalbla.com</EventURL> 
     <VenueID>175</VenueID> 
     <VenueName>Bournemouth International Centre (BIC)</VenueName> 
     <VenueAddress>Exeter Road</VenueAddress> 
     <VenueCity>Bournemouth</VenueCity> 
     <VenueState /> 
     <VenueCountryCode>GB</VenueCountryCode> 
     <VenuePostCode>BH2 5BH</VenuePostCode> 
     <MinCurrentPrice>90.4500</MinCurrentPrice> 
     <MaxCurrentPrice>213.0700</MaxCurrentPrice> 
     <AvailableTickets>14</AvailableTickets> 
     <OnSaleDate>2014-12-03T18:24:00</OnSaleDate> 
     </EventList> 
<PrimaryCategory> 
    <PrimaryCategoryID>2</PrimaryCategoryID> 
    <PrimaryCategoryName>concert</PrimaryCategoryName> 
    <PrimaryCategoryURL>http://www.blalbalbla.com</PrimaryCategoryURL> 
    <CategoryList> 
     <CategoryID>13632</CategoryID> 
     <CategoryName>Ron Sexsmith</CategoryName> 
     <CategoryURL>http://www.blalbalbla.com</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
    </CategoryList> 
    <CategoryList> 
     <CategoryID>25605</CategoryID> 
     <CategoryName>blablabal</CategoryName> 
     <CategoryURL>http://www.blalbalbla.coms</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
    </CategoryList> 
    <CategoryList> 
     <CategoryID>21935</CategoryID> 
     <CategoryName>Idina Menzel</CategoryName> 
     <CategoryURL>hhttp://www.blalbalbla.com</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
     <EventList> 
     <EventID>749820</EventID> 
     <EventName>Idina Menzel</EventName> 
     <EventDate>2015-06-26T20:00:00</EventDate> 
     <EventURL>http://www.blalbalbla.com0</EventURL> 
     <VenueID>175</VenueID> 
     <VenueName>Bournemouth International Centre (BIC)</VenueName> 
     <VenueAddress>Exeter Road</VenueAddress> 
     <VenueCity>Bournemouth</VenueCity> 
     <VenueState /> 
     <VenueCountryCode>GB</VenueCountryCode> 
     <VenuePostCode>BH2 5BH</VenuePostCode> 
     <MinCurrentPrice>90.4500</MinCurrentPrice> 
     <MaxCurrentPrice>213.0700</MaxCurrentPrice> 
     <AvailableTickets>14</AvailableTickets> 
     <OnSaleDate>2014-12-03T18:24:00</OnSaleDate> 
     </EventList> 
    </CategoryList> 
</PrimaryCategory> 

所以我會檢索屬於PrimaryCategory其中PrimaryCategoryID = 3

+6

這很可能使用awk,但它不是正確的工具。我建議你看看使用XML解析器。 – 2015-02-06 11:05:36

+0

並非所有的計算機都安裝了適當的工具,並且可以安裝的工具有限制。作爲一個例子,Ubuntu沒有標準的'xmllint'。但我同意,最好的方法是使用正確的工具。 – Jotne 2015-02-06 12:00:34

+0

發佈預期的輸出。我們可能並不都知道'檢索特定標籤之間的文本'和'檢索標籤'對您意味着什麼。並減少你的樣本輸入 - 我敢肯定,它是十幾行,每行20個字符,而不是50行100個字符,或者這將幫助我們更清楚地看到你的問題。 – 2015-02-06 13:36:41

回答

0

嘗試標籤這一點,它會從你的xml文件如下檢索PrimaryCategoryID元素的值,

grep -oP '(?<=>).*?(?=</PrimaryCategoryID>)' data.xml 

輸出會,

3 
2

不要使用基於行的工具來處理XML,這將無法正常工作。沒有人希望您的XML處理代碼在空格轉換,插入換行符或以不同順序指定的標記時中斷。

取而代之,請使用正確解析XML並使用XPath進行選擇的工具。例如,xmllint

xmllint --xpath '//PrimaryCategory[PrimaryCategoryID=3]' filename.xml 

xmlstarlet

xmlstarlet sel -t -c '//PrimaryCategory[PrimaryCategoryID=3]' filename.xml 

注意,這個希望您的輸入是有效的XML,這在你的問題的片段是不是(也缺少結束標記) 。我正在假設這是一個複製/粘貼錯誤。

0

gnu awk(由於記錄選擇多個字符)應該做的:

awk -v RS="<PrimaryCategory>" '{split($1,a,"<|>")} a[3]==3 {print RT,$0}' file 
<PrimaryCategory> 
    <PrimaryCategoryID>3</PrimaryCategoryID> 
    <PrimaryCategoryName>Billets de concert</PrimaryCategoryName> 
    <PrimaryCategoryURL>http://www.viagogo.fr/Billets-de-concert</PrimaryCategoryURL> 
    <CategoryList> 
     <CategoryID>13632</CategoryID> 
     <CategoryName>Ron Sexsmith</CategoryName> 
     <CategoryURL>http://www.viagogo.fr/Billets-de-concert/Pop-Rock/Ron-Sexsmith-Billets</CategoryURL> 
     <CategoryImageURL>http://cdn1.viagogo.net/img/cat/1207/2/1.jpg</CategoryImageURL> 
     <CategoryDescription /> 
    </CategoryList> 
    <CategoryList> 
     <CategoryID>27605</CategoryID> 
     <CategoryName>Theme Park</CategoryName> 
     <CategoryURL>http://www.blalbalbla.com</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
    </CategoryList> 
    <CategoryList> 
     <CategoryID>21935</CategoryID> 
     <CategoryName>Idina Menzel</CategoryName> 
     <CategoryURL>http://www.blalbalbla.com</CategoryURL> 
     <CategoryImageURL>http://www.blalbalbla.com</CategoryImageURL> 
     <CategoryDescription /> 
     <EventList> 
     <EventID>740520</EventID> 
     <EventName>Idina Menzel</EventName> 
     <EventDate>2015-06-26T20:00:00</EventDate> 
     <EventURL>http://www.blalbalbla.com</EventURL> 
     <VenueID>175</VenueID> 
     <VenueName>Bournemouth International Centre (BIC)</VenueName> 
     <VenueAddress>Exeter Road</VenueAddress> 
     <VenueCity>Bournemouth</VenueCity> 
     <VenueState /> 
     <VenueCountryCode>GB</VenueCountryCode> 
     <VenuePostCode>BH2 5BH</VenuePostCode> 
     <MinCurrentPrice>90.4500</MinCurrentPrice> 
     <MaxCurrentPrice>213.0700</MaxCurrentPrice> 
     <AvailableTickets>14</AvailableTickets> 
     <OnSaleDate>2014-12-03T18:24:00</OnSaleDate> 
     </EventList> 

它分割使用<PrimaryCategory>作爲記錄分隔的文件。
然後,如果字段1包含數字3,打印分隔符和行的其餘部分

相關問題