perl排序临时目录

时间:2010-08-10 16:53:35

标签: perl unix sorting

我在我的机器上遇到了空间问题,因此unix中的sort命令因为/ 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 {
      .......
}

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你在这里有四个级别的解释(perl,shell,awk,shell)。 sort 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

答案 1 :(得分:0)

您已在$变量之前转义TMPDIR,导致$TMPDIR传递给shell。由于这未在您的环境中定义,因此命令最终如下:

sort -T \ -k1,1

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

答案 2 :(得分:0)

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");