ソートは「sed --in-place」などのファイルソートをサポートしていますか?

ソートは「sed --in-place」などのファイルソートをサポートしていますか?

--in-place私は視覚障害者ですか、それと同じオプションはありませんかsort

結果を入力ファイルに保存するには、sedは-i--in-place)を使用します。

sort出力を入力ファイルにリダイレクトする

sort < f > f

その結果、空になります。オプションがない場合--in-place- これを行うためのいくつかのトリックがあるかもしれません。便利どのように?

(私の心の中に浮かぶ唯一のことは:

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

移動するのは正しい選択ではありません。ファイル権限変更されることがあります。そのため、一時ファイルの内容で上書きして削除します。 )

答え1

sortファイル名を引数として使用する-o(または)オプションがあります。--outputプログラムはデータを一時ファイルに書き込み、ソートが完了した後に元の入力ファイルを上書きします(これはすべての入力データを読み取った後にのみ発生します)。 (これは本質的にdoneと同じですsed -i。)

GNU sort情報ページから:

    -o OUTPUT-FILE
    --output=OUTPUT-FILE
      出力書き込み結果ファイル標準出力の代わりに。通常、 sort開く前にすべての入力を読みます。結果ファイルsort -o F F したがって、同じコマンドを使用してファイルを安全に並べ替えることができますcat F | sort -o F。ただし、()をsort使用すると、すべての入力を読み取る前に出力ファイルを開くことができるため、このコマンドは読み取りが完了する前に書き込みが開始されるため安全ではありません。--merge-mcat F | sort -m -o F - GsortFcat

      最新のシステムでは、設定されている場合は-o入力ファイルの後に表示できません。たとえば、移植可能なスクリプトは入力ファイルの前に指定する必要があります。POSIXLY_CORRECTsort F -o F-o OUTPUT-FILE

そしてからOpen Group基本仕様7号:

    -o output
      標準出力の代わりに使用する出力ファイルの名前を指定します。このファイルは入力ファイルの1つと同じにすることができます。
sortディスク容量やディスククォータが不足したり、出力ファイルの書き込み中にシステムがクラッシュしたり、その他のエラーが発生した場合、sortデータの一部または全部が削除(破棄)される可能性があるという報告があります。

つまり、ファイルを所定の位置にソートするには、次のコマンドを使用できます。

sort -o filename filename

答え2

あなたはそれを使用することができますspongestdin最初に浸してからファイルに書き込む関数です。たとえば、次のようになります。

sort < f | sponge f

欠点spongeは、出力を一時的にメモリに保存するため、大容量ファイルの場合は問題になる可能性があることです。それ以外の場合は、最初にファイルに書き込んでから元のファイルを上書きする必要があります。

ただし、他の回答で指摘したように、内部修正は、プロセス(spongeプロセスなど)中にコンピュータがクラッシュして元のファイルと新しいファイルの両方を失う可能性があるため、通常は良い考えではありません。まず、別のファイルに書き込み、次にアトム(移動)コマンドを使用することをお勧めしますmv

答え3

ファイルの書き込み中にプログラムまたはシステムがクラッシュすると両方が失われるため、入力ファイルを出力ファイルで上書きすることは危険です。

一部のプログラム(主にGNUバージョン)には内部オプションがあります(-iPerlとGNU sed、-oGNUソートなど)。それらがどのように機能するかは、データを一時ファイルに入れてからその場所に移動することです。

このオプションがないプログラムの場合、コリンワトソンのspongeユーティリティ(付属Joey Hessのmoreutils)は、すべてのプログラムに対してこの操作を自動的に実行します(例:cutファイルをその場で変更できますか?;iconvに入力ファイルを変換された出力に置き換えさせるにはどうすればよいですか?)。ただし、失敗してもdo_stuff | sponge myfile空または無効な出力で常に上書きされます。パイプで接続されたコマンドが成功したかどうかを検出する方法はありません。したがって、一時ファイルを使用する場合に比べて入力は便利ですが、安全ではありません。myfiledo_stuffsponge

同じ権限で元のファイルを再作成できないまれな場合にのみ、そのファイルを上書きすることをお勧めします。この場合、元の入力をどこかに保存することをお勧めします。その後、入力コピーを処理して元のファイルに送信できます。

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional

答え4

-ovimメソッドを使用または試してください。

$ ex -s +'%!sort' -cxa file.txt

関連情報