【问题标题】:Struggle with awk [duplicate]与awk斗争[重复]
【发布时间】:2021-04-30 22:10:26
【问题描述】:

我有一个 18M 长的 xml 文件,其中包含媒体列表的一系列记录。文件的大小取决于每条记录都有一个嵌入图像这一事实。导出列表的应用程序导出了整个记录列表,没有回车。我要做的是仅提取每个 xml 记录中包含该记录的描述字段的部分。一些示例记录如下所示:

<media>
  <version>2</version>
  <broadcasts><broadcast><name>KSBW-DT</name><description>KSBW-DT Channel 8</description><genre /><audio_only>False</audio_only><cover_art>THERE IS A MEGABYTE OF IMAGE DATA CONTAINED HERE IN EACH RECORD</cover_art><location>8</location><img>b4/b4098184-bc85-4b17-9a87-43d2c4a23bdd</img></broadcast>
  <broadcast><name>Cntrl Coast</name><description>Cntrl Coast Channel 9</description><genre /><audio_only>False</audio_only><cover_art>THERE IS A MEGABYTE OF IMAGE DATA CONTAINED HERE IN EACH RECORD</cover_art><location>9</location><img>44/443f0080-ca33-4150-8873-23359d8999dd</img></broadcast>
...(680 more records)....
</broadcasts></media>

我玩 awk 已经有一段时间了,现在试图只提取“描述文本”,但结果却是空的。我尝试的任何模式要么返回不匹配,要么返回包含所有数据的整个 18MB 字符串。这是我的 awk 脚本的最新版本:

#!/bin/bash
set -x
awk '{
        for( i=1; i<=NF; i++) {
                tmp=match($i, /\<description\>.*\<\/description>)
                if (tmp) {
                        print $i
                }
        }
}' $1

但这并没有返回任何东西。我过去只使用过 awk,其中文本中有典型的行,而不是连续的 18MB 字符串。 awk 甚至可以解析这样的东西吗?我已经尝试了 web-grep -o、sed 上建议的替代方法,但我似乎无法得到任何工作。

感谢任何帮助或指导。

谢谢.....

【问题讨论】:

  • 感谢您在问题中展示您的努力,您能否在您的问题中也发布预期输出示例以便更好地理解问题,谢谢。
  • Don't Parse XML/HTML With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。
  • 另一个选项是xpath,一个perl程序...看看xpath -q -e '//description/text()' file是否解决了你的问题,见stackoverflow.com/questions/15461737/…

标签: xml awk


【解决方案1】:

定义一个适合您的数据的新记录分隔符(没有换行符 - awk 中的默认值)。

考虑为此目的使用&lt; 符号,它将成为 XML 数据中每个标记的开始。

使用字段分隔符来分隔每条记录(因此可以使用 $1、$2 表示法来引用它)。在这种情况下,&gt; 符号是一个不错的选择。现在,匹配 $1 作为标签 'description' 并且 $2 将是值。

现在 awk 命令应该如下所示:

awk -v RS="<" -F ">" '{
    /^description$/ {print $2}
}' filename.xml

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2017-06-22
    • 2020-09-18
    • 2018-05-23
    • 2013-11-08
    • 1970-01-01
    相关资源
    最近更新 更多