无聊的AWK高手可以转换一下这个Python程序吗?

问题描述 投票:0回答:3

我喜欢 Python,但不太关心 AWK。为了进行比较(并了解 Python 到 AWK 的大师如何做到这一点),有人可以在 AWK 中重写以下 Python 程序吗?考虑到它的长度,有些人会认为重写对于任何有一点时间的人来说都是简单易行的。

import os

ROOT = '/Users/Zero/Documents/MyProgram.app/Contents/TempFiles'
ID = '628251 173511 223401 138276 673278 698450 629138 449040 901575'.split()

def main():
    for name in os.listdir(ROOT):
        if '.log' in name.lower():
            path = os.path.join(ROOT, name)
            if os.path.isfile(path):
                data = open(path, 'rb').read()
                for line in data.split('\r'):
                    for number in ID:
                        if number in line:
                            print line
                            break

if __name__ == '__main__':
    main()
python comparison awk lazy-evaluation
3个回答
6
投票

为什么使用 awk?

对我来说这看起来像是一个简单的 grep 命令;像这样的东西:

egrep -w '628251|173511|223401|138276|673278|698450|629138|449040|901575' /Users/Zero/Documents/MyProgram.app/Contents/TempFiles/*.log*

更新:或者使用 find+grep,如一些评论中的建议,如果打算进行递归搜索


4
投票
BEGIN{
   id="628251 173511 223401 138276 673278 698450 629138 449040 901575"
   m=split(id,ID," ")
   for(i=1;i<ARGC;i++){
       while( (getline line<ARGV[i] ) > 0 ){
           n=split(line,LINE," ")
           for ( o=1; o<=n; o++){
                for(num in ID){
                   if ( num == LINE[o] ){
                     print line
                   }
                }
           }
       }
   }
}

另存为

myscript.awk
,然后

#!/bin/bash
ROOT = "/Users/Zero/Documents/MyProgram.app/Contents/TempFiles"
cd $ROOT
awk -f myscript.awk file* #do for files that start with "file"

@OP,

对于文本/文件处理,awk 不输给 Perl 或 Python 或任何其他语言。如果您(或其他认为 awk 已过时的人)感兴趣,请访问 http://awk.info。不,awk 在现代环境中仍然有其用途。不要让任何人告诉你其他情况


0
投票

在 TAWK 和 GAWK 中,这是可行的,并利用 awk 的自动循环和简洁的天赋 开始{ id =“628251 173511 223401 138276 673278 698450 629138 449040 901575” gsub(" ", "|", id) } $0 ~ id {打印($0);关闭(文件名)}

© www.soinside.com 2019 - 2024. All rights reserved.