一个无聊的AWK大师可以转换这个Python程序吗?

时间:2010-10-20 01:39:03

标签: python comparison awk lazy-evaluation

我喜欢Python,但并不关心AWK。为了进行比较(以及查看Python-to-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()

2 个答案:

答案 0 :(得分:6)

为什么选择awk?

这看起来像是一个简单的grep命令给我;类似的东西:

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

更新:或使用find + grep,如某些评论中所建议的,如果要进行递归搜索

答案 1 :(得分: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仍然在现代环境中有其用途。不要让别人告诉你