在linux中排序多个文件

Pau*_*aul 7 linux sorting file

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

file0.txt
file1.txt
file2.txt
Run Code Online (Sandbox Code Playgroud)

我不想将它们加入到单个文件中,因为生成的文件将是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
Run Code Online (Sandbox Code Playgroud)

我要这个:

f0.txt
AAA
BBB
CCC

f1.txt
DDD
EEE
FFF

f2.txt
XXX
YYY
ZZZ
Run Code Online (Sandbox Code Playgroud)

JBe*_*ert 15

我不知道一个命令在进行就地排序,但我认为更快的"合并排序"是可能的:

for file in *.txt; do
    sort -o $file $file
done
sort -m *.txt | split -d -l 1000000 - output
Run Code Online (Sandbox Code Playgroud)
  • sort在for循环确保输入文件的内容进行分类.如果您不想覆盖原件,只需更改-o参数后面的值即可.(如果您希望文件是已经排序,你可以更改排序声明"仅检查": sort -c $file || exit 1)
  • 第二个sort是高效合并输入文件,同时保持输出排序.
  • 这是通过管道split输出的命令,然后写入后缀输出文件.注意-角色; 这告诉split要从标准输入(即管道)而不是文件中读取.

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

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


sar*_*old 6

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

for f in file*.txt ; do sort -o $f < $f ; done
sort --merge file*.txt | split -l 100000 - sorted_file
Run Code Online (Sandbox Code Playgroud)

(这是每个输出文件100,000行.也许这仍然太小.)


Cas*_*bel 5

我相信这是您最好的选择,使用股票 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选项排序让它知道输入文件已经排序,因此它可以智能。