【问题标题】:Retrieving the text between a specific XML tag using AWK使用 AWK 检索特定 XML 标记之间的文本
【发布时间】:2015-04-06 12:13:14
【问题描述】:

这是我的问题:我的 xml 文件太重 (60 MB),所以我想检索特定标签之间的文本。

我的 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 的标签

【问题讨论】:

  • 使用 awk 很可能做到这一点,但它不是适合这项工作的工具。我建议您考虑使用 XML 解析器。
  • 并非所有计算机都安装了适当的工具,您可以安装的工具可能会受到限制。 Ubuntu 没有 xmllint 作为标准示例。但我同意,最好的方法是使用正确的工具。
  • 发布预期的输出。我们可能并不都知道retrieve the text between a specific tagretrieve the tags 对您意味着什么。并减少您的示例输入 - 我确信它是十几行左右,每行 20 个字符,而不是 50 行,每行 100 个字符,或者任何有助于我们更清楚地看到您的问题的东西。

标签: xml linux parsing ubuntu awk


【解决方案1】:

这个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>

它使用&lt;PrimaryCategory&gt; 作为记录分隔符来分割文件。
然后如果字段1 包含数字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,而您问题中的 sn-p 不是(缺少结束标记)。我假设这是一个复制/粘贴错误。

    【讨论】:

      【解决方案3】:

      试试这个,它会从你的xml文件中检索PrimaryCategoryID元素的值,如下所示,

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

      你的输出将是,

      3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-27
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 2013-03-23
        相关资源
        最近更新 更多