繁体   English   中英

在Linux中对多个文件进行排序

[英]sort across multiple files in linux

我有多个文件。 每个非常大:

file0.txt
file1.txt
file2.txt

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

我想要排队。 (如果可能,是否在适当的位置?)这意味着从file0.txt末尾开始的file0.txt行将移至file1.txt的开始,反之亦然。

我正在Linux上工作,并且还很新。 我知道单个文件的sort命令,但是想知道是否有一种方法可以对多个文件进行排序。 或者,也许有一种方法可以将较小的文件制成伪文件,而linux将这些文件视为单个文件。

我知道可以做什么:我可以分别对每个文件进行排序,然后读入file1.txt以查找大于file0.txt最大文件的值(并且类似地从file0.txt末尾file0.txt ), file0.txt然后进行排序。 ,但是这很file2.txt并且假设file2.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

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

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

另外,这是合并排序方式的简短摘要:

  1. sort从每个文件读取一行。
  2. 它对这些行进行排序,然后选择应该排在最前面的那一行。 该行被发送到输出,并且从包含该行的文件中读取新行。
  3. 重复步骤2,直到在任何文件中没有更多的行。
  4. 此时,输出应该是一个完美排序的文件。
  5. 利润!

这并不是您真正想要的,但是使用--merge选项可以使sort(1)实用程序有所帮​​助。 分别对每个文件进行排序,然后对生成的文件堆进行排序:

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

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

我相信,这是使用库存Linux实用程序的最佳选择:

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

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

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

mmap()这3个文件,因为所有行的长度均为40字节,因此您可以轻松地对它们进行排序(SIP :-)。 不要忘记最后的msync。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM