如何在Perl中对文本文件中的行进行排序?

Laz*_*zer 3 sorting scripting perl

我有几个文本文件(A.txtB.txt)看起来像这样(每个可能有~10000行)

processa,id1=123,id2=5321
processa,id1=432,id2=3721
processa,id1=3,id2=521
processb,id1=9822,id2=521
processa,id1=213,id2=1
processc,id1=822,id2=521
Run Code Online (Sandbox Code Playgroud)

我需要检查文件中的每一行A.txt是否也存在B.txt(B.txt可能还有更多,这没关系).

问题是行可以在两个文件中以任何顺序排列,所以我想我会在两个文件中以某种特定顺序对它们进行排序O(nlogn),然后将每一行匹配A.txt到下一行B.txtO(n).我可以实现一个哈希,但文件很大,这种比较只发生一次,之后这些文件被重新生成,所以我认为这不是一个好主意.

在Perl中对文件进行排序的最佳方法是什么?任何订购都可以,它只需要一些订购.

例如,在字典排序中,这将是

processa,id1=123,id2=5321
processa,id1=213,id2=1
processa,id1=3,id2=521
processa,id1=432,id2=3721
processb,id1=9822,id2=521
processc,id1=822,id2=521
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,只要Perl做得很快,任何排序都会一样好.

我想在打开文件之后从Perl代码中执行此操作

open (FH, "<A.txt");
Run Code Online (Sandbox Code Playgroud)

任何评论,想法等都会有所帮助.

zig*_*don 5

要对脚本中的文件进行排序,您仍然需要将整个内容加载到内存中.如果你这样做,我不确定排序它的好处是什么只是加载到哈希?

像这样的东西会起作用:

my %seen;
open(A, "<A.txt") or die "Can't read A: $!";
while (<A>) {
    $seen{$_}=1;
}
close A;

open(B, "<B.txt") or die "Can't read B: $!";
while(<B>) {
  delete $seen{$_};
}
close B;

print "Lines found in A, missing in B:\n";
join "\n", keys %seen;
Run Code Online (Sandbox Code Playgroud)