如何把 awk 脚本移植到 Python( 二 )


移植 awk 字段到 Python例如 , 让我们将这个单行代码“ 如何使用 awk 从文件中删除重复行 ”转换为 Python 。
awk 中的原始代码是:
awk '!visited[$0]++' your_file > deduplicated_file“真实的” Python 转换将是:
import collectionsimport sysvisited = collections.defaultdict(int)for line in open("your_file"): did_visit = visited[line] visited[line] += 1 if not did_visit: sys.stdout.write(line)但是 , Python 比 awk 具有更多的数据结构 。与其计数访问次数(除了知道是否看到一行 , 我们不使用它) , 为什么不记录访问的行呢?
import sysvisited = set()for line in open("your_file"): if line in visited: continue visited.add(line) sys.stdout.write(line)编写 Python 化的 awk 代码Python 社区提倡编写 Python 化的代码 , 这意味着它要遵循公认的代码风格 。更加 Python 化的方法将区分唯一性和输入/输出的关注点 。此更改将使对代码进行单元测试更加容易:
def unique_generator(things): visited = set() for thing in things: if thing in visited: continue visited.add(things) yield thingimport sys for line in unique_generator(open("your_file")): sys.stdout.write(line)将所有逻辑置于输入/输出代码之外 , 可以更好地分离问题 , 并提高代码的可用性和可测试性 。
结论:Python 可能是一个不错的选择将 awk 脚本移植到 Python 时 , 通常是在考虑适当的 Python 代码风格时重新实现核心需求 , 而不是按条件/操作进行笨拙的音译 。考虑原始上下文并产生高质量的 Python 解决方案 。虽然有时候使用 awk 的 Bash 单行代码可以完成这项工作 , 但 Python 编码是通往更易于维护的代码的途径 。
【如何把 awk 脚本移植到 Python】另外 , 如果你正在编写 awk 脚本 , 我相信您也可以学习 Python!如果你有任何疑问 , 请告诉我 。


推荐阅读