【问题标题】:Parsing Text FIle Using Awk使用 awk 解析文本文件
【发布时间】:2018-10-27 22:18:44
【问题描述】:

我想解析一个包含感兴趣部分的文本文件,如下所示:

mesh 0 400 12000
400 300 400
1 0 -1
300 500 600
0 0 1
etc....
12000
1300
1100
etc..

我只想要紧跟以字符串mesh 开头的行以及之后的所有其他行,并且有 3 列。我希望此输出位于一个单独的文本文件中,并带有修改的名称。

所以想要的输出文本文件:

400 300 400
300 500 600

我尝试使用 python 和循环来执行此操作,但实际上花了几个小时并且从未完成,因为原始文本文件中有数千到数十万行。

在使用 awk 的 bash 脚本中是否有更有效的方法?

【问题讨论】:

  • 为什么1 0 -10 0 1 不在输出中?它们也有三列。
  • 我只想在网格之后每隔一行。所以在 python 中,我知道我可以通过使用 mod 函数来指定它。如果网格被计为第 1 行,那么下一行将是 2,然后是 3、4、5 等。我只对包含 3 个 colmun 的偶数行 (%2) 感兴趣(因为这些行在某些时候会变成单列点)
  • Python 也具有正则表达式功能。这个问题看起来可以用一个相当简单的 Python 脚本来解决——不需要使用 bash 和 awk。首先,您扫描以找到以mesh 开头的行,可以说,“打开开关”。现在,也许在嵌套循环中,您开始寻找行。像split 这样的函数可能很简单——或者是一个查找由空格分隔的三组数字的正则表达式。深吸一口气,然后再试一次。或者,发布您第一次尝试的摘录

标签: parsing awk


【解决方案1】:

awk 来救援!

$ awk '/^mesh/{n=NR;next} NF==3 && n && NR%2==(n+1)%2' file > filtered_file
400 300 400
300 500 600

【讨论】:

  • 谢谢!!这正是我所需要的!我最初尝试过这样的事情,但对语法不够熟悉以使其工作。输出到新文件也可以!
猜你喜欢
  • 2015-01-12
  • 2018-03-31
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多