[英]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
sort
确保输入文件的内容已排序。 如果您不想覆盖原始文件,只需在-o
参数后面更改值即可。 (如果您希望文件已经被排序,则可以将sort语句更改为“ check-only”: sort -c $file || exit 1
) sort
有效合并输入文件,同时保持输出排序。 split
命令的,然后它将写入后缀的输出文件。 注意-
字符; 这告诉split从标准输入(即管道)读取而不是从文件读取。 另外,这是合并排序方式的简短摘要:
sort
从每个文件读取一行。 这并不是您真正想要的,但是使用--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.