【问题标题】:Calling awk script from perl从 perl 调用 awk 脚本
【发布时间】:2015-07-30 17:41:13
【问题描述】:

我正在尝试通过我的 perl 脚本使用 awk 脚本。因此,当我尝试从命令行调用 awk 脚本时,它可以正常工作,如下所示

awk -f script.awk file.txt

...awk 脚本打开 file.txt 并进行一些计算。

但是,当我尝试通过我的 perl 脚本做同样的事情时,我无法让它工作 :( 我已经尝试了 100 万件事情,但没有任何工作。你能帮忙吗?这就是我正在使用的perl 脚本:

`awk '-f /path/to/script.awk /path/to/target/file.txt'`;

...但我得到一个“没有这样的文件或目录”。我试过不带单引号,带双引号,不带-f,我已经进入script.awk并添加了#!/bin/awk -f,以上所有的组合,没有任何作用。我在文件名中没有任何特殊字符,它们只是普通名称。没有变量或其他任何东西。

如果你能帮助我,我将不胜感激:)

谢谢!

【问题讨论】:

  • 您的反引号命令行失败,因为 awk 试图打开一个名为 -f /path/to/script.awk /path/to/target/file.txt 的文件。这不是文件的名称。删除单引号,以便为 awk 提供 多个选项
  • 嗨@ghoti,感谢您的回答。如果我在没有单引号的情况下尝试上述语法,它不会返回任何内容。正如汤姆所说,我必须在它前面加上print(duh),然后删除单引号。谢谢你们两个:)

标签: perl awk


【解决方案1】:

你根本不需要任何引号:

$ cat test.awk 
{ print $1 }
$ cat script.pl 
use strict;
use warnings;

print `awk -f test.awk file`;
$ cat file
first second third
$ perl script.pl 
first

您的尝试失败的原因是 '-f /path/to/script.awk /path/to/target/file.txt' 周围的引号意味着它被视为 awk 的单个参数。

另外,需要明确的是,当你在 Perl 中使用反引号执行命令时,会返回命令的输出,所以如果你想显示它,你应该使用 print

您也可以使用system 代替反引号。语法为system PROGRAM LIST,其中LIST 是要传递给PROGRAM(在本例中为awk)的参数列表。例如:

system "awk", "-f", "test.awk", "file";

值得一提的是,根据您的 awk 脚本的复杂程度,您可能需要考虑使用一种或另一种语言来完成整个工作。

【讨论】:

  • 您好,感谢您的回答! print 成功了。我什至没有想到。感谢您澄清单引号的效果。 awk 脚本只是对 .txt 文件中的 2 个短列进行一些计算,它找到总和和平方根,没什么特别的。
  • @kouki 如果您使用system 代替反引号,则不需要printsystem "awk", "-f", "test.awk", "file";
  • @melpomene 哦耶!!有用!我试过system,但不是所有的东西都用单独的双引号括起来,我只是把你写的命令用双引号括起来,我得到了语法错误。你能解释一下为什么单独的双引号有效但system "awk -f test.awk file"; 无效吗?是因为 Tom 所说的,它被视为 awk 的单个参数吗?
  • @kouki 我已经编辑了我的答案来解释system 的用法。
  • @kouki 不,system "awk -f test.awk file" 也应该可以工作。相当于system "/bin/sh", "-c", "awk -f test.awk file"
猜你喜欢
  • 2015-11-08
  • 2012-05-30
  • 1970-01-01
  • 2021-10-19
  • 2012-07-23
  • 2015-02-25
  • 2015-06-01
  • 2014-06-05
相关资源
最近更新 更多