【问题标题】:Split file with pattern and use pattern as file names [closed]使用模式拆分文件并使用模式作为文件名[关闭]
【发布时间】:2019-12-02 23:20:33
【问题描述】:

文件包含如下数据

  <p> 21-01-72  XXXXX YYYY ZZZZ</p>

  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>

  <p> 22-01-72  XXXXX YYYY ZZZZ</p>

  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>

  <p> 23-01-72  XXXXX YYYY ZZZZ</p>

  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>

用于以下命令拆分为多个文件,其中第一行成为文件名

awk '/-72/{gsub(/<p> /,""); gsub("</p>",""); gsub(" ",""); fname=$0".dat"; next} {print > fname}' data.xml

用数据创建了 3 个文件

  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>

现在,所有新文件都需要在开头附加&lt;article&gt;,最后附加&lt;/article&gt;。我们如何在同一个 awk 命令中做到这一点?还是以后使用单独的命令更好?

所需的数据文件

<article>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
</article>

【问题讨论】:

  • 投票重新打开,因为(合理的?)代码已添加,并声明了它产生的内容和想要的内容。 @Rv555 -- 将来,请始终包括您尝试过的内容以及做过或没做过的事情。

标签: perl unix awk


【解决方案1】:

这个gnu awk 应该这样做:

awk -F"[ <]+" '/<p> ([0-9][0-9]-){2}[0-9][0-9]/ {f=$3" "$4" "$5" "$6} {print >f ".txt"}' file

cat "21-01-72 XXXXX YYYY ZZZZ.txt"
  <p> 21-01-72  XXXXX YYYY ZZZZ</p>

  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>

cat "22-01-72 XXXXX YYYY ZZZZ.txt"
  <p> 22-01-72  XXXXX YYYY ZZZZ</p>

  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>
  <p>Line Data XX YY ZZ</p>

它将搜索日期部分并将其用作文件名。

【讨论】:

  • 您应该提到它依赖于未定义的行为(输入/输出重定向右侧的未括号表达式),因此它会在不同的 awk 中执行不同的操作。在创建大约 15 个输出文件并出现“打开的文件太多”错误后,它也会在所有 awk 中失败,除了 gawk。如果我是你,我只会在前面说“使用 gawk ...”!
猜你喜欢
  • 2022-11-27
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多