【问题标题】:how to use awk command where the file is perl variable如何在文件是 perl 变量的情况下使用 awk 命令
【发布时间】:2019-12-09 22:53:10
【问题描述】:
  1. 无法在 perl 脚本中运行 awk 命令,而且我的文件是可变的。

  2. 我尝试过不同的方式,例如使用 system(awk '/"">/{nr[NR]; nr[NR+6]}; NR in nr' $download_content) 并将输出存储在数组中,但没有运气。

    $filter = `awk '/"">/{nr[NR]; nr[NR+6]}; NR in nr' $download_content`;
    
  3. 这里的 $download_content 是一个网页,即 html 格式,我需要提取搜索模式行及其下第 6 行。

【问题讨论】:

  • 为什么不直接在 perl 中完成呢? 特别是如果您正在处理 HTML,因为 perl 有许多 HTML 解析模块可供选择以完成适当的工作。

标签: arrays perl variables awk


【解决方案1】:

当你写这样的东西时:

awk '/"">/{nr[NR]; nr[NR+6]}; NR in nr' XXXX

然后awk 期望“XXXX”是它应该处理的文件的名称。但是(据我了解)这不是您所遇到的情况。在我看来,“XXXX”是您想要处理的实际数据。在这种情况下,您需要将数据通过管道传输到awk。最简单的选择是使用echo

echo XXXX | awk '/"">/{nr[NR]; nr[NR+6]}; NR in nr'

你应该可以使用 Perl 的system() 函数来做同样的事情。

但是将 awk 代码重新实现为 Perl 可能会更简单。

【讨论】:

    【解决方案2】:

    这里是一个使用IPC::Run3的例子:

    use IPC::Run3;
    
    # [...]
    
    my @cmd = ('awk', '/"">/{nr[NR]; nr[NR+6]}; NR in nr');
    my $in = $download_content;
    my $out;
    run3 \@cmd, \$in, \$out; 
    $filter = $out;
    

    或者,您可以在perl 中执行此操作(而不是调用awk):

    my @lines = split /\n/, $download_content;
    my %nr;
    my $NR = 0;
    my $filter = "";
    for ( @lines ) {
        if ( /"">/ ) {
            $nr{$NR}++;
            $nr{$NR + 6}++;
        }
        $filter .= "$_\n" if $nr{$NR};
        $NR++;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-02-26
      • 1970-01-01
      • 2016-01-14
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多