Sorting gnu排序-当手册中说“合并选项有作用”时,它是什么意思;“不排序”;

Sorting gnu排序-当手册中说“合并选项有作用”时,它是什么意思;“不排序”;,sorting,columnsorting,external-sorting,gnu-sort,Sorting,Columnsorting,External Sorting,Gnu Sort,我正在尝试对一个太大而无法放入内存的文件进行排序。选项-m下的gnu排序人员声明:合并已排序的文件;不要排序。我正在努力理解这一点的含义,以确保这一点能够实现我想要的。这篇文章()建议结合使用gnusplit和gnusort来完成这样的任务,方法是首先将文件分解成适合内存的较小部分,分别对它们进行排序,然后重新组合。到目前为止,我的实验似乎表明这个过程确实有效。尽管如此,手册中对合并选项的描述仍然让我感到困扰,因为它没有排序。出于我的目的,需要对大文件进行完全排序,而不仅仅是将已在本地排序的较小

我正在尝试对一个太大而无法放入内存的文件进行排序。选项-m下的gnu排序人员声明:
合并已排序的文件;不要排序
。我正在努力理解这一点的含义,以确保这一点能够实现我想要的。这篇文章()建议结合使用gnusplit和gnusort来完成这样的任务,方法是首先将文件分解成适合内存的较小部分,分别对它们进行排序,然后重新组合。到目前为止,我的实验似乎表明这个过程确实有效。尽管如此,手册中对合并选项的描述仍然让我感到困扰,因为它没有排序。出于我的目的,需要对大文件进行完全排序,而不仅仅是将已在本地排序的较小部分串联起来。尽管我已经在小示例上测试了该程序,并且它似乎有效,但该手册使我对将其应用于实际情况缺乏信心,因为我担心在无法验证gnu sort是否按照我的预期运行的情况下,可能会出现意外行为

给出一个MWE,考虑我想排序的这个选项卡分离文件:

3   4
2   5
3   1
1   3
我尝试了以下操作:

SortDir="/Users/aireties/Desktop/Sort_Experiments"
## sort document as a whole (in practice, this would be infeasible due to document size)
sort --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/To_Be_Sorted.txt" -o "$SortDir/Sorted_as_Whole.txt"  ## sort first by the first column values, then by the second

1   3
2   5
3   1
3   4
这是一次对整个文件排序时的“正确”解决方案(在我的实际用例中是不可行的)

如果我尝试将文件分成几部分,然后立即使用-m选项,则会得到错误的结果:

## Break file into pieces
MaxLines=2
mkdir "$SortDir/Pieces/"
split -l $MaxLines "$SortDir/To_Be_Sorted.txt" "$SortDir/Pieces/"
## Try merge sort on pieces without first sorting them
sort -m --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/Pieces/"* -o "$SortDir/Sorted_in_Pieces1.txt"

3   1
1   3
3   4
2   5
for file in "$SortDir/Pieces/"*  ## sorts all text files in pwd
do
  sort --field-separator=$'\t' -k 1,1 -k 2,2 "$file" -o "$file"
done    

sort -m --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/Pieces/"* -o "$SortDir/Sorted_in_Pieces2.txt"    

1   3
2   5
3   1
3   4


cmp --silent "$SortDir/Sorted_in_Pieces1.txt" "$SortDir/Sorted_as_Whole.txt" || echo "files are different"
# file are different
cmp --silent "$SortDir/Sorted_in_Pieces2.txt" "$SortDir/Sorted_as_Whole.txt" || echo "files are different"
看起来gnu排序只是考虑了这两个独立的部分,并根据彼此中的第一个值对它们进行排序。因此,它将第二件放在成品的第一位,但没有进行其他排序

或者,如果我遵循此处提倡的过程(),即首先对片段进行排序,然后合并,我似乎得到了正确的结果:

## Break file into pieces
MaxLines=2
mkdir "$SortDir/Pieces/"
split -l $MaxLines "$SortDir/To_Be_Sorted.txt" "$SortDir/Pieces/"
## Try merge sort on pieces without first sorting them
sort -m --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/Pieces/"* -o "$SortDir/Sorted_in_Pieces1.txt"

3   1
1   3
3   4
2   5
for file in "$SortDir/Pieces/"*  ## sorts all text files in pwd
do
  sort --field-separator=$'\t' -k 1,1 -k 2,2 "$file" -o "$file"
done    

sort -m --field-separator=$'\t' -k 1,1 -k 2,2 "$SortDir/Pieces/"* -o "$SortDir/Sorted_in_Pieces2.txt"    

1   3
2   5
3   1
3   4


cmp --silent "$SortDir/Sorted_in_Pieces1.txt" "$SortDir/Sorted_as_Whole.txt" || echo "files are different"
# file are different
cmp --silent "$SortDir/Sorted_in_Pieces2.txt" "$SortDir/Sorted_as_Whole.txt" || echo "files are different"
对我来说,关键是如果工件文件很大,仍然需要进行大量计算才能将它们合并到一个正确排序的文件中。因此,我发现很难将如此大量的排序描述为声称它“不排序”的操作的结果


有人能告诉我为什么手册会这样写吗?我们为什么以及如何确信gnu sort在使用合并选项时能够可靠地实现它所声称的功能?手册文本是否暗示在某些情况下,此过程将无法达到预期的结果?

与mergesort的
合并操作一样,
-m
简单地将文件合并在一起。它要求两个文件按照相同的顺序排序

所以,要对一个非常大的文件进行排序,您所做的工作确实有效:将它拆分为几个较小的文件,在本地对它们进行排序。在这一点上,如果您只是将每个文件附加到另一个文件,您将得到类似
0123。。。0 1 2 3

-m
选项可以正确地合并它们

例如:

a  b
1  3
2  2
3  1

sort -m a b
# 1 2 3 3 2 1
sort -m a a
# 1 1 2 2 3 3
sort -m b b
# 3 2 1 3 2 1
sort -r -m b a
# 3 2 1 1 2 3

-m
只是将文件合并在一起,就像mergesort的
合并操作一样。它要求两个文件按照相同的顺序排序

所以,要对一个非常大的文件进行排序,您所做的工作确实有效:将它拆分为几个较小的文件,在本地对它们进行排序。在这一点上,如果您只是将每个文件附加到另一个文件,您将得到类似
0123。。。0 1 2 3

-m
选项可以正确地合并它们

例如:

a  b
1  3
2  2
3  1

sort -m a b
# 1 2 3 3 2 1
sort -m a a
# 1 1 2 2 3 3
sort -m b b
# 3 2 1 3 2 1
sort -r -m b a
# 3 2 1 1 2 3
Gnu排序(至少是我在源代码中看到的版本)将对内存中的文件块进行排序,并创建一组临时文件(每个块1个临时文件)。它还在内存排序阶段使用多线程(命令行参数可以设置要使用的最大线程数)。创建所有临时文件后,它将对临时文件执行16路合并(除非您重写此操作),直到生成单个已排序文件

这里的要点是,您不必首先将文件拆分为单独的文件,因为gnu sort将自动处理一个大文件,根据需要创建排序的临时文件以合并为单个排序的文件

-m选项用于合并多个已排序文件的特殊情况。

Gnu-sort(至少是我在源代码中看到的版本)将对内存中的文件块进行排序,并创建一组临时文件(每个块1个临时文件)。它还在内存排序阶段使用多线程(命令行参数可以设置要使用的最大线程数)。创建所有临时文件后,它将对临时文件执行16路合并(除非您重写此操作),直到生成单个已排序文件

这里的要点是,您不必首先将文件拆分为单独的文件,因为gnu sort将自动处理一个大文件,根据需要创建排序的临时文件以合并为单个排序的文件


-m选项用于合并多个已排序文件的特殊情况。

我怀疑概念上的问题在于“合并”的含义。在排序算法的上下文中,“合并”具有特定的含义。请参阅以进行讨论。一个关键点是,虽然合并操作确实会将多个文件作为输入,但任何单个输入文件中的项都必须按正确的顺序进行排序,以便合并执行它应该执行的操作——这与排序操作不同。从这个意义上说,“合并不排序”


还有一种称为“合并排序”的排序算法,它将合并操作作为其组成部分之一。

我怀疑概念上的问题在于“合并”的含义。在排序