从awk调用python脚本

3 投票
2 回答
3144 浏览
提问于 2025-04-16 16:53

大多数网上的解决方案都是从Python中调用awk。但我想反过来做。我有一个Python脚本,它从一个文件中提取信息。不过,这个文件名在awk脚本的某一列中被引用。

我该如何把参数"%s20s"和文件名传给Python,并从标准输出中获取输入呢?我想把这个输出作为更多的列添加进去。

谢谢你的例子

祝好

2 个回答

3

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

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

不过,这样做只会返回一个状态码。如果你想获取标准输入(stdin)的内容,可以这样做:

$ 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
3

awk中的变量FILENAME会告诉你当前正在处理的文件名(如果是从标准输入读取,则显示为'-')。不过,这个变量在BEGIN块中是无法使用的,但你可以用ARGV[1]来代替(前提是你只传入一个文件名):

#!/bin/awk -f

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

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

#!/usr/bin/python

import sys
print(sys.argv)

所以我得到了以下输出:

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

撰写回答