微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在linux中排序多个文件

我有多个(很多)文件;每个都非常大:
file0.txt
file1.txt
file2.txt

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

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

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

我所知道的可以做到:
我可以单独对每个文件进行排序并读入file1.txt以查找大于file0.txt中最大值的值(并且类似地从file0.txt的末尾抓取行),join然后排序..但这很痛苦并假设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

解决方法

我不知道一个命令在进行就地排序,但我认为更快的“合并排序”是可能的:
for file in *.txt; do
    sort -o $file $file
done
sort -m *.txt | split -d -l 1000000 - output

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

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

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

原文地址:https://www.jb51.cc/linux/394721.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐