【问题标题】:awk to perl conversionawk 到 perl 的转换
【发布时间】:2011-06-16 05:46:30
【问题描述】:

我有一个充满文件的目录,其中包含以下记录:

FAKE ORGANIZATION
799 S FAKE AVE
Northern Blempglorff, RI 99xxx


                                                                      01/26/2011
     These items are being held for you at the location shown below each one.
     IF YOU ASKED THAT MATERIAL BE MAILED TO YOU, PLEASE DISREGARD THIS NOTICE.

     The Waltons. The complete  DAXXXX12118198
     Pickup at:CHUPACABRA LOCATION                                 02/02/2011







                                                  GRIMLY, WILFORD
                                                  29 FAKE LANE
                                                  S. BLEMPGLORFF RI  99XXX

我需要删除所有带有 Pickup at:CHUPACABRA LOCATION 表达式的条目。

“记录分隔符”问题: 我无法触摸输入文件的格式——它必须按原样保留。每条记录 由大约 40 多个新行分隔。

这里有一些 awk(可行):

BEGIN { 
    RS="\n\n\n\n\n\n\n\n\n+" 
    FS="\n"
}
!/CHUPACABRA/{print $0}

我对 perl 的尝试:

perl -a -F\n -ne '$/ = "\n\n\n\n\n\n\n\n\n+";$\ = "\n";chomp;$regex="CHUPACABRA";print $_ if $_ !~ m/$regex/i;' data/lib51.000

没有返回任何内容。除了命令行,我不确定如何在 perl 中指定“字段分隔符”。尝试了 a2p 实用程序——没有骰子。对于好奇的人,这是它产生的结果:

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z
            # process any FOO=bar switches

#$FS = ' ';     # set field separator
$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

$/ = "\n\n\n\n\n\n\n\n\n+";
$FS = "\n";

while (<>) {
    chomp;  # strip record separator
    if (!/CHUPACABRA/) {
    print $_; 
   }   
}

这必须在某人的 Windows 机器下运行,否则我会坚持使用 awk。

谢谢!

布布诺夫

编辑(已解决)**

谢谢大佬! 这是一个(工作的)perl 脚本版本(调整后的 a2p 输出):

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z
            # process any FOO=bar switches

#$FS = ' ';     # set field separator
$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

$/ = "\n"x10;
$FS = "\n";

while (<>) {
    chomp;  # strip record separator
    if (!/CHUPACABRA/) {
    print $_; 
    }   
}

随意发布改进或 CPAN 好东西,使这更惯用和/或 perl-ish。谢谢!

【问题讨论】:

  • 嗯 Chupacabra ...这就是它不起作用的原因。
  • 我看你认识他。山羊的毁灭者……以及最近的……perl 脚本。

标签: perl awk


【解决方案1】:

在 Perl 中,记录分隔符是文字字符串,而不是正则表达式。正如the perlvar doc 所说:

记住:$/ 的值是字符串,而不是正则表达式。 awk 必须更好。 :-)

不过,您似乎可以使用$/="\n" x 10 或类似的东西逃脱:

perl -a -F\n -ne '$/="\n"x10;$\="\n";chomp;$regex="CHUPACABRA";
       print if /\S/ && !m/$regex/i;' data/lib51.000

注意额外的/\S/ &amp;&amp;,它将跳过输入中包含超过 20 个连续换行符的空段落。

另外,您是否考虑过在您的 Windows 机器上安装 Cygwin 并让 awk 可用?

【讨论】:

  • 已经安装好了。我需要他们能够单击并运行某些东西。我认为 activestate perl 比 Cygwin 化的 awk 脚本更符合要求。不过,我愿意接受建议。
  • 老兄,我太亲近了。谢谢!这就是我所缺少的。有关脚本版本,请参见我上面的编辑。
【解决方案2】:

如果可以下载gawk for windows,就不需要(多)转换

【讨论】:

  • 嗯......这是一个想法。除了 perl 似乎在不同平台之间基本一致......而我在 Windows(Cygwin、Interix/SUA)上使用我在 Linux 上编写的脚本遇到了 awks 的困难。感谢您的建议!
【解决方案3】:

您是否知道 Perl 附带了一个名为 a2p 的程序,它完全按照您在标题中描述的那样做?

而且,如果您的机器上有 Perl,则该程序的文档已经存在:

C> perldoc a2p

我自己的建议是获得Llama book 并学习 Perl。不管 Python 人怎么说,Perl 是一种伟大而灵活的语言。如果您了解 shell、awk 和 grep,您将毫无问题地理解许多 Perl 结构。

【讨论】:

  • 知不知道原帖人试过a2p? “尝试了 a2p 实用程序——没有骰子。”
  • 是的,正如我上面提到的,我尝试了 a2p(不能正确转换 RS)。我喜欢 Perl,但对于快速的单行代码,我仍然更喜欢 awk 和 sed。我最终修改了原始的 a2p 输出......成功(在暴民的帮助下)。
  • 我有“骆驼书”和食谱。仍在穿过它们。我会去那里的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2015-07-17
  • 2016-08-02
  • 2013-07-09
  • 2012-09-19
  • 1970-01-01
相关资源
最近更新 更多