如何将如何将 awk 脚本移植到脚本移植到 Python
脚本是解决问题的有效方法,而 awk 是编写脚本的出色语言。它特别擅长于简单的文本处理,它可以带你完成
配置文件的某些复杂重写或目录中文件名的重新格式化。这篇文章主要介绍了如何把 awk 脚本移植到 Python,
需要的朋友可以参考下
将一个 awk 脚本移植到 Python 主要在于代码风格而不是转译。
脚本是解决问题的有效方法,而 awk 是编写脚本的出色语言。它特别擅长于简单的文本处理,它可以带你完成配置文件的某
些复杂重写或目录中文件名的重新格式化。
何时从何时从 awk 转向转向 Python
但是在某些方面,awk 的限制开始显现出来。它没有将文件分解为模块的真正概念,它缺乏质量错误报告,并且缺少了现在被
认为是编程语言工作原理的其他内容。当编程语言的这些丰富功能有助于维护关键脚本时,移植将是一个不错的选择。
我最喜欢的完美移植 awk 的现代编程语言是 Python。
在将 awk 脚本移植到 Python 之前,通常值得考虑一下其原始使用场景。例如,由于 awk 的局限性,通常从 Bash 脚本调用
awk 代码,其中包括一些对 sed、sort 之类的其它命令行常见工具的调用。 最好将所有内容转换为一个一致的 Python 程序。
有时,脚本会做出过于宽泛的假设,例如,即使实际上只运行一个文件,该代码也可能允许任意数量的文件。
在仔细考虑了上下文并确定了要用 Python 替代的东西之后,该编写代码了。
标准标准 awk 到到 Python 功能功能
以下 Python 功能是有用的,需要记住:
with open(some_file_name) as fpin:
for line in fpin:
pass # do something with line
此代码将逐行循环遍历文件并处理这些行。
如果要访问行号(相当于 awk 的 NR),则可以使用以下代码:
with open(some_file_name) as fpin:
for nr, line in enumerate(fpin):
pass # do something with line
在在 Python 中实现多文件的中实现多文件的 awk 式行为式行为
如果你需要能够遍历任意数量的文件同时保持行数的持续计数(类似 awk 的 FNR),则此循环可以做到这一点:
def awk_like_lines(list_of_file_names):
def _all_lines():
for filename in list_of_file_names:
with open(filename) as fpin:
yield from fpin
yield from enumerate(_all_lines())
此语法使用 Python 的生成器和 yield from 来构建迭代器,该迭代器将遍历所有行并保持一个持久计数。
如果你需要同时使用 FNR 和 NR,这是一个更复杂的循环:
def awk_like_lines(list_of_file_names):
def _all_lines():
for filename in list_of_file_names:
with open(filename) as fpin:
yield from enumerate(fpin)
for nr, (fnr, line) in _all_lines:
yield nr, fnr, line
更复杂的 FNR、NR 和行数的 awk 行为
如果 FNR、NR 和行数这三个你全都需要,仍然会有一些问题。如果确实如此,则使用三元组(其中两个项目是数字)会导致
混淆。命名参数可使该代码更易于阅读,因此最好使用 dataclass:
import dataclass
@dataclass.dataclass(frozen=True)
class AwkLikeLine:
content: str
fnr: int
nr: int
评论0
最新资源