メモリに入りきらないサイズのファイルをソートしようとしています。オプション-mのgnuソートの人は、merge already sorted files; do not sort
と言っています。私はソートが私が望んでいるものを達成することを確実にするために、これの意味を理解するのに苦労しています。この記事(Sorting in pandas for large datasets)は、gnu splitとgnu sortの組み合わせを提案します。このようなタスクを達成するには、最初にファイルをメモリに収められた小さな部分に分割し、それぞれを個別にソートしてから再結合します。これまでの私の実験は、この手順が実際に機能することを示しているようです。それにもかかわらず、マニュアルではソートされていないというマージオプションの説明には悩まされています。私の目的のために、大きなファイルは、ローカルでソートされた小さな部分の連結だけでなく、完全にソートする必要があります。私は小さな例で手順をテストしたが、うまくいくように見えますが、gnuの検証ができなくなった場合に予期しない動作が発生する可能性があるので、ソートは私が意図したとおりに機能しました。 MWEを与えることgnu-sort - マージオプションが「ソートしない」と言ったときのマニュアルの意味
、私は並べ替えしたいと思い、このタブ区切りファイルを検討:
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
何が表示されたことが起こったのは、GNUソートがちょうど2つ考えられているということです別々の小片を作り、互いの最初の値に関してそれらをソートした。したがって、この完成品には2番目の作品が最初に置かれましたが、他のソートは行われていません。最初のピースを並べ替えた後、マージすることである
代わりに私が続く場合は、手順はこちら(Sorting in pandas for large datasets)を提唱し、私は正しい結果を得るように見えるん:スティッキングポイント、私にとって
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は、マージオプションを使用するときに、確実に何を主張するのか、なぜ、どのようにすればよいでしょうか?マニュアルのテキストは、何らかの形で、この手順では望みの結果が得られない場合があることを示唆していますか?