sort -o
重複しているようです。可能であればそれを使用するのはなぜですかsort >
?
時にはシェルリダイレクトは利用できませんか?
答え1
ファイルを所定の位置に並べ替える:
sort -o file file
最初に使用すると、sort file >file
呼び出されたファイルをfile
ゼロサイズに切り捨て、sort
その空のファイルを呼び出すと、元のファイルの内容に関係なく空の出力ファイルが生成されます。
また、コマンドまたはオプションのリストから自動的に作成済みたとえば、スクリプトを使用して-o somefile
オプションの最後に追加すると、以前に設定された出力ファイルが上書きされるため、出力ファイルの場所を追加のオプションで制御できます。
sort_opt=( some list of options )
if [ ... something ... ]; then
# We don't need to go through and delete any old use of "-o"
# because this later option would override it.
sort_opt+=( -o somefile.out )
fi
sort "${sort_opt[@]}" "$thefile"
sort
シェルがファイルをリダイレクトせずにバイナリ実行可能ファイルを直接呼び出すこともあります。
これは-o
標準オプション--output
ですが、GNU拡張です。
答え2
主な目的は、ファイルを所定の位置に配置できることです。始める前に切り捨てることができるため、リダイレクトではこれを行うことはできませんsort myfile >myfile
。myfile
sort
これが特に有用な理由sort
は、sort
既存の実装が大容量ファイル(RAMよりはるかに大きい場合があります)を処理し、そのためにディスク上の一時ファイルを使用できるためです。これとは対照的に、他の既存のテキスト処理ユーティリティは、主にファイルを1行ずつストリームとして処理するように設計されており、一度にメモリに数行以上を保存する必要がないため、大容量ファイルをサポートしています。
この能力はすでにUnix第2版。このバージョンでは、入力内容を一時ファイルにコピーする内容を文書化します。その理由は、RAMが不足しても大容量ファイルを並べ替えることができるからです。 Unixsort
ユーティリティは、ほぼ最初から大容量ファイルを念頭に置いて設計されています。
2版のマニュアルでは、入力ファイルが出力ファイルと同じであることを明示的に言及していません。確認するソースコードも見つかりませんが、これは実装技術から派生する可能性があります。 (存在する初版、マニュアルには特別な内容は記載されていません。ソースも見つかりません。バイナリこの場合、正しい出力は生成されません。 )しかし、これらの初期バージョンでは、コマンドラインオプションの構文はまだしっかりと確立されていないため、構文はまだありませsort input output
ん。sort -o output input
Unixの3番目のバージョンでは、所定の位置で並べ替える機能が明示的に記載されています。sort myfile
ソートされたバージョンと交換してください。myfile
Unixバージョン4から、構文が若干変更されます。sort myfile
ソートされた出力を標準出力に書き込みますが、ファイルを所定の位置にソートしますsort myfile myfile
(このマニュアルでは、「入力ファイルと出力ファイルが同じである可能性があります」と明示的に指定されています)。Unixバージョン5からで出力ファイルを指定する構文は最新の-o
オプションです。
バージョン5は、マージモード()を最初にサポートsort -m
し、複数入力ファイルをサポートする最初のバージョンです。これは関連しています。マージモードは複数の入力にのみ役立ちますが、複数のファイルをまとめる必要はほとんどなく、cat … | sort
パフォーマンスを低下させることなく実行できます(sort
データは一時文書に書き込まれるため)。マージモードでは、sort
入力ファイルのいずれかに書き込むことはできません。これは、すべての入力を一度に1行ずつ読み込み、出力を段階的に書き込むがコピーしないためです。
入力ファイルに書き込む機能(マージモードを除く)は、Unixおよび(ほとんどの)レプリケーションの歴史全体にわたって維持されています。POSIX。