Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 是否有可靠的方法对文件列进行排序?_Perl_Sorting_System Calls_Tsv - Fatal编程技术网

Perl 是否有可靠的方法对文件列进行排序?

Perl 是否有可靠的方法对文件列进行排序?,perl,sorting,system-calls,tsv,Perl,Sorting,System Calls,Tsv,我有一个Perl脚本,使用system调用对tsv文件进行排序: system("sort -k8 -r -n -t \$'\t' in.txt > out.txt"); 它在CentOS和SUSE Linux中运行良好。但在Ubuntu中,它给出了一个错误: sort: multi-character tab `$\t' 似乎不同操作系统的问题在于对报价的解释不同。您是否有一种简单但更健壮的方法来用Perl对tsv文件进行排序 通常,您会使用system的数组调用来避免shell,但

我有一个Perl脚本,使用
system
调用对tsv文件进行排序:

system("sort -k8 -r -n -t \$'\t' in.txt > out.txt");
它在CentOS和SUSE Linux中运行良好。但在Ubuntu中,它给出了一个错误:

sort: multi-character tab `$\t'

似乎不同操作系统的问题在于对报价的解释不同。您是否有一种简单但更健壮的方法来用Perl对tsv文件进行排序

通常,您会使用
system
的数组调用来避免shell,但命令中有I/O重定向,这很难处理。OTOH,
sort
允许您使用
-o
指定输出文件,并且指定的文件可以是其中一个输入(尽管此处不提供):


不调用shell;选项卡没有损坏。我将
-r
-n
选项组合成一个选项;如果愿意,您可以将它们分开,或者(必要时)将它们添加到
-k8
选项之后。

我会咬一口:为什么要使用系统排序命令而不是内部Perl排序命令?Perl排序将更快、更高效,并且可以在所有操作系统上工作——甚至在Windows上。David,我正在考虑将文件加载到数组中,对其进行排序,然后将其写出。这很麻烦。此外,在我的程序中,对文件进行排序并不是一个瓶颈,所以我只采取简单的方法。或者你有一个简单有效的方法吗?谢谢。区别在于ubuntu的
/bin/sh
是dash,而不是bash<代码>$'\t'是一种巴什主义。@DavidW。是什么让您认为perl排序会更快?系统排序非常快,不限于内存中的数据集大小。Perl不是一个速度恶魔,它是一个HLL,与在较低抽象级别编写的程序相比,它的开销很大。@dberhur有几篇关于这个问题的文章。如果OP为这种特殊情况编写了自己的C sort程序,它将比Perl快,但Unix sort命令是为了灵活性而编写的。与我认为的简单编译的Unix系统命令相比,我对Perl的速度感到惊讶。很好,这种方法适用于这种排序命令。但是,如果我想通过管道将输入从另一个输出传递出去,会发生什么呢?创建另一个临时文件是唯一的选择吗?另外,如果命令没有输出选项,并且我不能使用重定向(>),会发生什么?对这两种情况有什么建议吗?非常感谢。如果您想通过管道与
sort
命令(或两者)进行通信,或者如果目标命令没有方便的
-o
-like选项,则必须在IPC(进程间通信)机制上更加努力,并且必须放弃
系统
,使用(在Unix上)
fork
exec
,等等,再加上水管。这是可以做到的;不过,为了节省您的工作量,建议您查看Perl中的IPC模块。另一个主要的选择是David W建议的:用Perl本身进行排序。您需要知道自己在做什么,但这也是可行的,并且可以避免临时文件cygwin@arjun你什么时候做的?我的回答中显示的命令似乎不太可能生成该错误。事实上,我是在使用eclipse进行调试时出错的。我不知道为什么?从cywin运行时,您的命令没有问题/错误。
my @cmd = ( "sort", "-k8", "-rn", "-t", "\t", "-o", "out.txt", "in.txt" );

system(@cmd);