在linux中排序多个文件

时间:2011-10-07 22:53:44

标签: linux file sorting

我有多个(很多)文件;每个都非常大:

file0.txt
file1.txt
file2.txt

我不想将它们加入到单个文件中,因为生成的文件将是10+ Gigs。每个文件中的每一行包含一个40字节的字符串。这些字符串现在排序很好,(大约1:10步骤是值的减少而不是增加)。

我想订购这些线。 (如果可能的话就位?)这意味着file0.txt末尾的一些行将被移动到file1.txt的开头,反之亦然。

我正在使用Linux并且对它很新。我知道单个文件的sort命令,但我想知道是否有办法对多个文件进行排序。或许有一种方法可以制作一个由较小的文件制作的伪文件,linux会将其视为单个文件。

我所知道的可以做的事: 我可以单独对每个文件进行排序并读入file1.txt以查找大于file0.txt中的最大值的值(并且同样从file0.txt的末尾抓取行),加入然后排序。但是这很痛苦,并且假设file2.txt中的值不属于file0.txt(但在我的情况下极不可能)

修改

要清楚,如果文件如下所示:

f0.txt
DDD
XXX
AAA

f1.txt
BBB
FFF
CCC

f2.txt
EEE
YYY
ZZZ

我想要这个:

f0.txt
AAA
BBB
CCC

f1.txt
DDD
EEE
FFF

f2.txt
XXX
YYY
ZZZ

5 个答案:

答案 0 :(得分:15)

我不知道执行就地排序的命令,但我认为可以更快地进行“合并排序”:

for file in *.txt; do
    sort -o $file $file
done
sort -m *.txt | split -d -l 1000000 - output
  • for循环中的sort确保输入文件的内容已排序。如果您不想覆盖原始内容,只需更改-o参数后面的值即可。 (如果您希望文件已经排序,可以将排序语句更改为“仅限检查”:sort -c $file || exit 1
  • 第二个sort可以有效地合并输入文件,同时保持输出排序。
  • 这是通过管道传递给split命令,然后命令将写入后缀输出文件。注意-字符;这告诉split要从标准输入(即管道)而不是文件中读取。

此外,这里是合并排序如何工作的简短摘要:

  1. sort从每个文件中读取一行。
  2. 它命令这些行并选择应该首先出现的行。该行被发送到输出,并从包含该行的文件中读取新行。
  3. 重复步骤2,直到任何文件中没有其他行。
  4. 此时,输出应该是一个完美排序的文件。
  5. 利润!

答案 1 :(得分:5)

这不完全是您要求的,但sort(1)实用程序可以使用--merge选项稍微提供帮助。单独对每个文件进行排序,然后对生成的文件堆进行排序:

for f in file*.txt ; do sort -o $f < $f ; done
sort --merge file*.txt | split -l 100000 - sorted_file

(每个输出文件只有100,000行。也许这仍然太小了。)

答案 2 :(得分:4)

我相信这是你最好的选择,使用股票linux实用程序:

  • 单独对每个文件进行排序,例如for f in file*.txt; do sort $f > sorted_$f.txt; done

  • 使用sort -m sorted_file*.txt | split -d -l <lines> - <prefix>对所有内容进行排序,其中<lines>是每个文件的行数,<prefix>是文件名前缀。 (-d告诉split使用数字后缀。)

排序的-m选项让它知道输入文件已经排序,因此它可以很聪明。

答案 3 :(得分:2)

mmap()3个文件,因为所有行都是40个字节长,你可以很容易地对它们进行排序(SIP :-)。不要忘记最后的msync。

答案 4 :(得分:1)

如果文件是单独排序的,那么您可以使用sort -m file*.txt将它们合并在一起 - 读取每个文件的第一行,输出最小的文件,然后重复。

相关问题