我喜欢 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()
为什么使用 awk?
对我来说这看起来像是一个简单的 grep 命令;像这样的东西:
egrep -w '628251|173511|223401|138276|673278|698450|629138|449040|901575' /Users/Zero/Documents/MyProgram.app/Contents/TempFiles/*.log*
更新:或者使用 find+grep,如一些评论中的建议,如果打算进行递归搜索
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 在现代环境中仍然有其用途。不要让任何人告诉你其他情况
在 TAWK 和 GAWK 中,这是可行的,并利用 awk 的自动循环和简洁的天赋 开始{ id =“628251 173511 223401 138276 673278 698450 629138 449040 901575” gsub(" ", "|", id) } $0 ~ id {打印($0);关闭(文件名)}