【问题标题】:perl sort temporary directoryperl 排序临时目录
【发布时间】:2011-03-27 22:54:47
【问题描述】:

我在我的机器上遇到了空间问题,因此 unix 中的排序命令由于 /tmp 中的空间不足而失败。为了避免这种情况,我决定使用 -T 选项运行 sort ,允许它使用其他目录来创建临时文件。这是我的 perl 脚本

   my $TMPDIR              = "/home/xyz/workspace/";
    my $sortCommand         = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T \$TMPDIR -k1,1\" }' test > test.sort";
    system_call($sortCommand, "Sort");
    sub system_call {
      .......
}

这在我的桌面上完美运行,但是当我在另一台机器上运行时,我得到了错误

“排序:无法创建临时文件:-k1,1/sortFoeXZx:没有这样的文件或目录”

有什么想法吗?

【问题讨论】:

    标签: perl unix sorting


    【解决方案1】:

    这里有四个解释级别(perl、shell、awk、shell)。排序shell命令是

    awk 'NR == 1; NR > 1 { print $0 | "sort -T $TMPDIR -k1,1" }' test > test.sort
    

    所以$TMPDIR 被内壳扩展。显然,在您的桌面机器上有一个该名称的环境变量,但在另一台机器上没有。最好的解决方法是使TMPDIR 成为环境变量并正确引用它(如果它的值包含必须防止 awk 或 shell 扩展的字符,则从 Perl 扩展它会导致问题)。

    $ENV{TMPDIR} = "/home/xyz/workspace/";
    my $sortCommand = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T \\\"\$TMPDIR\\\" -k1,1\" }' test > test.sort";
    

    如此依赖 Perl 程序的外部工具很奇怪。好吧,如果sort溢出/tmp,那么Perl内置的sort很可能内存不足。所以使用Sort::External

    【讨论】:

      【解决方案2】:

      您在TMPDIR 变量之前转义了$,这导致$TMPDIR 被传递到shell。由于这没有在您的环境中定义,因此命令结束如下:

      sort -T \ -k1,1
      

      这无意中转义了以下空格字符,从而导致您的错误。

      【讨论】:

      • @ar: 差不多,但不完全是:shell 看不到任何 \ 那里。
      【解决方案3】:

      FWIW,您可以使用File::Tempdir 来创建一些代码,这将让您创建一个具有适当用户权限的临时目录或文件,无论您的环境如何。

      use File::Temp 'tempdir';
      my $tempdir = tempdir(CLEANUP => 1);
      my $sortCommand         = "awk 'NR == 1; NR > 1 { print \$0 | \"sort -T $tempdir -k1,1\" }' test > test.sort";
      system_call($sortCommand, "Sort");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 2016-01-03
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        相关资源
        最近更新 更多