从 awk 调用 python 脚本

发布于 2024-11-04 19:12:19 字数 168 浏览 0 评论 0原文

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

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

谢谢你的例子

干杯

most of the solutions out there call awk from python. But i want to do it the other way round. I have a python script that extracts information from a file. However said filename is referenced in a column of the awk script.

How do i pass python the argument "%s20s", filename and get the input from the standard output? i want to add the output as several columns more.

thanks for your examples

Cheers

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

江南月 2024-11-11 19:12:19

awk 变量 FILENAME 给出当前正在处理的文件的名称(如果是标准输入则为“-”)。然而,这在 BEGIN 块中不可用,但您可以使用 ARGV[1] 代替(假设您只传递一个文件名):

#!/bin/awk -f

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

我用于测试的 python 脚本 (py3) 是:

#!/usr/bin/python

import sys
print(sys.argv)

所以我得到以下输出:

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

The awk variable FILENAME gives the name of the current file being processed (or '-' if stdin). However, this is not available in the BEGIN block, but you can use ARGV[1] instead (assuming you are only passing one filename):

#!/bin/awk -f

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

The python script (py3) I used for testing was:

#!/usr/bin/python

import sys
print(sys.argv)

So I get the following output:

/home/user1> runit.awk afile
./myscript.py "%s20s" afile
['./myscript.py', '"%s20s"', 'afile']
无人问我粥可暖 2024-11-11 19:12:19

您可以使用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

You can call external commands using the system function. Does that solve your problem?

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

But that only provides the return code. If you need to capture stdin you can do this:

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

Getline works line-by-line so if you want multiple lines:

$ awk 'BEGIN { while ("cat multi_line_file" | getline) { print "output: "$0 } }'
output: line 1
output: line 2
output: line 3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文