【问题标题】:Perl: extract rows from 1 to n (Windows)Perl:从 1 到 n 提取行(Windows)
【发布时间】:2011-05-03 10:12:27
【问题描述】:

我想从我的 .csv 文件中提取第 1 到第 n 行。使用这个

perl -ne 'if ($. == 3) {print;exit}' infile.txt 

我只能提取一行。如何将一系列行放入此脚本中?

【问题讨论】:

标签: perl csv


【解决方案1】:

如果您只有一个范围和一个可能串联的输入流,您可以使用:

#!/usr/bin/perl -n
if (my $seqno = 1 .. 3) {
    print;
    exit if $seqno =~ /E/;
}

但是如果你想让它应用于每个输入文件,你需要捕获每个文件的结尾:

#!/usr/bin/perl -n
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;

如果您想善待忘记 args 的人,请在 BEGININIT 子句中添加一个很好的警告:

#!/usr/bin/perl -n
BEGIN { warn "$0: reading from stdin\n" if @ARGV == 0 && -t }
print if my $seqno = 1 .. 3;
close ARGV if eof || $seqno =~ /E/;

值得注意的点包括:

  • 您可以在#! 行上使用-n-p。您也可以将一些(但不是全部)其他command line switches 放在那里,例如‑l‑a

  • 数字文字为 标量触发器的操作数 每个运算符都进行比较 readline 计数器,所以标量 1 .. 3 实际上是 ($. == 1) .. ($. == 3)

  • 调用eof 时既没有参数也没有空括号 表示在magic ARGV 文件列表中读取的最后一个文件。这与eof() 形成对比,eof()整个 <ARGV> 迭代的结束。

  • 返回触发器运算符的最终序列号,并附加一个"E0"

  • -t 运算符调用 libc 的 isatty(3),默认为 STDIN 句柄 — 与任何其他文件测试运算符不同。

  • 编译期间会出现BEGIN{} 块,因此如果您尝试使用‑MO=Deparse 反编译此脚本以查看它的实际作用,该检查将执行。使用INIT{},则不会。

  • 这样做会显示隐式输入循环作为一个名为 LINE 的标签,您可能会在其他情况下使用它来发挥您的优势。

HTH

【讨论】:

    【解决方案2】:

    有什么问题:

    head -3 infile.txt
    

    如果你真的必须使用 Perl,那么这个方法可行:

    perl -ne 'if ($. <= 3) {print} else {exit}' infile.txt 
    

    【讨论】:

    • 我认为head 的问题在没有 cygwin 的 Windows 上运行。
    • perl -wpe'1..3 or exit' infile.txt
    • @ysth 我的例子的重点不是尽可能写出最简略的 Perl,而是展示一个更通用的基于行号的条件处理示例。
    • so ysth 向您展示了“基于行号的最通用的条件处理方式”。
    • 不,我的展示了如何“做 a 或做 b”。他的意思是“打印,或退出”。
    【解决方案3】:

    您可以使用范围运算符:

    perl -ne 'if (1 .. 3) { print } else { last }' infile.txt
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多