我有多个(很多)文件;每个都非常大:
file0.txt
file1.txt
file2.txt
我不想将它们合并到一个文件中,因为生成的文件将超过 10 场演出。每个文件中的每一行都包含一个 40 字节的字符串。现在字符串的排序相当好(大约 1:10 的步长是值的减少而不是增加)。
我想要订购的线路。 (如果可能的话就地?)这意味着从末尾开始的一些行file0.txt
将被移动到开头file1.txt
反之亦然。
我正在 Linux 上工作,而且对它还很陌生。我知道关于sort
命令用于单个文件,但我想知道是否有一种方法可以对多个文件进行排序。或者也许有一种方法可以用较小的文件创建一个伪文件,Linux 会将其视为单个文件。
我所知道的可以做到:
我可以单独对每个文件进行排序并读入file1.txt
找到大于最大的值file0.txt
(并类似地从末尾抓取行file0.txt
),加入然后排序..但这很痛苦并且假设没有值file2.txt
属于file0.txt
(但就我而言不太可能)
Edit
需要明确的是,如果文件如下所示:
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
- The
sort
for 循环中确保输入文件的内容已排序。如果不想覆盖原来的,只需更改后面的值即可-o
范围。 (如果您希望文件已经排序,您可以将排序语句更改为“仅检查”:sort -c $file || exit 1
)
- 第二
sort
有效地合并输入文件,同时保持输出排序。
- 这通过管道传输到
split
命令然后将写入带后缀的输出文件。注意-
特点;这告诉 split 从标准输入(即管道)而不是文件中读取。
另外,这里是合并排序如何工作的简短摘要:
-
sort
从每个文件中读取一行。
- 它对这些行进行排序并选择应该排在第一位的行。该行被发送到输出,并从包含该行的文件中读取新行。
- 重复步骤 2,直到任何文件中都不再有行。
- 此时,输出应该是一个完美排序的文件。
- Profit!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)