【问题标题】:Split large text file using AWK, given specific parameters给定特定参数,使用 AWK 拆分大文本文件
【发布时间】:2016-08-04 23:36:09
【问题描述】:

您好,我正在尝试分割一个包含项目标签的 xml 文件。由于我在一个文件中有 250 个项目,我想将整个文件分成 5 个较小的文件,每个文件包含 50 个项目(及其内容)。

我从这个链接Linux script: how to split a text into different files with match pattern得到了什么

awk '{if ($0 ~ /<item>/) a++} { print > ("NewDirectory"a".xml") }'

但是,这会将整个文件分成每 1 个项目 1 个文件。所以我需要帮助修改此语句以将文件拆分为每 50 个项目 1 个文件。

【问题讨论】:

  • 如果您尝试重新创建格式正确的xml 文件,您将需要更多的代码。而且因为xml 和正则表达式永远不能毫无问题地“一起玩”,(即使你可以解决这个特殊问题)你正在为日后让你的经理失望的时候打下基础,当你背负沉重的时候XML 问题非常复杂,必须使用 xml 感知工具来解决。正如@sjsam 所指出的,您的 Q 需要少量样本输入、预期输出、您当前的代码和错误消息。
  • 为什么是“小样本输入”?如果你用 4 行文件来解决你的问题,创建 2 x 2 行文件,你可以解决你真正的问题,对吧?祝你好运。
  • @shellter 我知道,只是采取“小”步骤。不为任何人这样做,只是想学习 awk。
  • 好吧,如果你只是想学习awk,你最好再找一个学习项目。通过 awk 掌握 xml 的道路是不可逾越的。大多数(所有)unix 实用程序旨在一次处理一行数据。 xml 有一组非常不同的组织原则,即&lt;tag attribx=yz&gt; &lt;tag2&gt; &lt;/tag2&gt;&lt;/tag&gt;,一百万个嵌套元素在一行,或者每个“元素”可以单独一行或由 2-100-n 个空行分隔,是完全合法的.

标签: bash awk


【解决方案1】:

假设您的原始命令执行您所说的操作,并且您完全理解尝试使用 awk 解析 XML 的问题:

awk '/<item>/ && (++a%50 == 1) { ++c } { print > ("NewDirectory"c".xml") }'

如果您同时打开了很多文件并且没有使用 GNU awk,您可能需要在其中添加一个 close()。傻眼吧。

另外,要学习 awk,请阅读 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书。

【讨论】:

  • 谢谢,不,不使用 GNU awk。 awk 和 gawk 有什么区别?
  • awk 之于马就像 gawk 之于 clydesdale。 “awk”是一种使用隐式读取循环和条件/动作语法来操作文本的工具。有许多 awk 工具(旧 awk、新 awk、真正的 awk、mawk、tawk、gawk、OSX awk、/usr/xpg4/bin/awk 等),其中 GNU awk 是最多的当前支持/可用的功能。 awk 有一个 POSIX 标准,因此许多 awk 变体将至少执行 POSIX 定义的功能,但也将具有附加功能。一些 awk 变体甚至不支持 POSIX,因此应避免使用。获取 GNU awk,gawk。
【解决方案2】:

试试:

awk '$0~/<item>/' | split -l50 -d - NewDirectory.

解释:

  • awk 将只提取那些包含&lt;item&gt;的行

  • split 会将标准输入拆分为 50 行的文件,命名为 NewDirectory.00NewDirectory.01 等。有关详细信息,请参阅 man split

【讨论】:

  • 我认为其目的是创建包含 50 个多行项目记录的文件,而不是仅包含项目开始标签的 50 行的文件。
  • awk 过滤器将打印通过测试的整行,而不仅仅是$1
  • 没错,这就是为什么我说包含开始标签的行。不过,没有理由认为整个项目将在一行中。
  • 哦,我明白了。我只是为 OP 中的尝试提供了一个快速修复。任何跨越多行的内容都需要更精细的解析,例如xml parsing in python.
  • 谢谢!是的,大卫是正确的,但这是我写得不好的问题(没有理想结果或输入文件的示例),但无论如何感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 2018-05-04
  • 2022-11-24
  • 1970-01-01
  • 2020-11-12
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多