2011-05-03 171 views
3

大多数解决方案都是从python调用awk。但我想反过来这样做。我有一个从文件中提取信息的python脚本。然而,所述文件名在awk脚本的列中被引用。从awk调用python脚本

如何传递python参数“%s20s”,文件名并从标准输出中获取输入?我想将输出添加为更多列。

感谢您的例子

干杯

+5

你尝试过这么远吗?你的awk脚本是什么?帮助我们帮助你!越详细越好! – jathanism 2011-05-03 13:39:19

回答

3

awk的变量FILENAME给出当前文件的名称正在处理(或“ - ”如果标准输入)。但是,这是在BEGIN块不可用,但可以使用ARGV [1],而不是(假设你只有经过一个文件名):

#!/bin/awk -f 

BEGIN { 
    cmd = "./myscript.py '\"%s20s\"' " ARGV[1] 
    print cmd 
    cmd | getline var  
    print var 
} 

的Python脚本(PY 3)我用于测试的是:

#!/usr/bin/python 

import sys 
print(sys.argv) 

所以我得到以下输出:

/home/user1> runit.awk afile 
./myscript.py "%s20s" afile 
['./myscript.py', '"%s20s"', 'afile'] 
+0

谢谢你的pyhton工作例子 – tarrasch 2011-05-09 11:32:22

3

您可以使用system函数调用外部命令。这能解决你的问题吗?

$ awk 'BEGIN { system("echo something") }' 
something 

但是,只提供了返回码。所以如果你想多行

$ awk 'BEGIN { "echo something" | getline; print "output: "$0 }' 
output: something 

函数getline工作线由行:如果您需要标准输入捕捉你能做到这一点

$ awk 'BEGIN { while ("cat multi_line_file" | getline) { print "output: "$0 } }' 
output: line 1 
output: line 2 
output: line 3