【问题标题】:Extract Data Using awk from multiple files使用 awk 从多个文件中提取数据
【发布时间】:2019-07-31 14:06:00
【问题描述】:

我有 1000 个这样的文件:

text1.txt

<span class="store-time">OPEN SINCE <em>Aug 9, 2010</em></span>

text2.txt

<span class="store-time">OPEN SINCE <em>Aug 9, 2012</em></span>

我想从 1000 个文件中提取所有日期,每个文件都在新行中,如下所示:

Aug 9, 2010
Aug 9, 2012
...

【问题讨论】:

  • 首先选择合适的工具。我建议使用 XML/HTML 解析器(例如 xmlstarlet)。
  • 怎么样!你能给我举个例子吗
  • xmlstarlet select --template --copy-of '//span/em/text()' -n text*.txt

标签: search awk grep extract


【解决方案1】:

如果您确定您的文件都具有这种格式,您可以使用简单的sed 表达式

sed -E -e 's/^<span class="store-time">OPEN SINCE <em>([A-Z][a-z]+ *[0-9]+, *[0-9]+)<\/em><\/span>/\1/' 

它只会找到您的行首,然后是看起来像日期的内容(字母后跟一个空格和一个数字,然后是一个逗号,然后是一个数字),以及您的行尾。
cat 你所有的文件并将结果发送到sed 输入,你就会得到日期列表。

但正如 cmets 中所指出的,解析 xml 文件可能会出现问题(例如参见 RegEx match open tags except XHTML self-contained tags )。如果 xml 标签分布在多行上,脚本将无法提取信息,例如以下数据

<span class="store-time">
OPEN SINCE <em>Aug 9, 2012</em>
</span>

为了处理这种情况,有更强大的工具。作为工具集合xmlstarlet 或perl 类如XML::libXML。他们能够执行更防崩溃的解析,但使用起来更复杂。

如果您确定所有文件都具有正确的格式,sed 脚本可以解决您的问题。

【讨论】:

    【解决方案2】:

    嗯,对于解析 XML 工具,例如 awk 或 sed 肯定不是首选,因为它们是基于行的,而 XML 不是。

    要在 awk 中完成你的工作,你可以使用类似的东西:

    awk '$0 ~ /<span class="store-time">.*/ {gsub(/^.*<em>/,"",$0) gsub(/<\/em>.*/,"",$0); print $0}' *.html
    

    此命令获取所有 html 文件 (*.html) 并搜索以 &lt;span class="store-time"&gt; 开头的行。 然后它将从行首到第一个 &lt;em&gt; 的所有内容替换为空字符串。 &lt;/em&gt;(包括&lt;/em&gt;)之后的所有内容都一样

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 2012-08-13
      • 2015-12-21
      • 2019-04-13
      • 2017-02-12
      • 2012-08-18
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多