web-dev-qa-db-ja.com

sortは、 `sed --in-place`のようにファイルをインプレースでソートすることをサポートしていますか?

私はブラインドですか、それともsort--in-placeのようなオプションはありませんか?

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

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

sort < f > f

空にします。 --in-placeオプションがない場合-便利なの方法でこれを行う方法がいくつかありますか?

(私の頭に浮かぶ唯一のもの:

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

移動は正しい選択ではありません。原因ファイルのアクセス権が変更される可能性があります。そのため、一時ファイルの内容で上書きしてから削除します。)

89

sortには、ファイル名を引数として取る-o, --outputオプションがあります。入力ファイルと同じ場合は、結果を一時ファイルに書き込み、元の入力ファイルを上書きします(sed -iとまったく同じです)。

GNU sort情報ページから:

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

および The Open Group Base Specifications Issue 7

-o  output
    Specify the name of an output file to be used instead of the standard 
    output. This file can be the same as one of the input files.
123
enzotib

sponge 関数を使用できます。最初にstdinをソークしてから、次のようにファイルに書き込みます。

sort < f | sponge f

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

ただし、他の回答で指摘されているように、プロセスの途中(たとえば、spongeの1つ)でマシンがクラッシュし、両方を失う可能性があるため、適切な変更は一般に良い考えではありません。元のファイルと新しいファイル。最初に別のファイルに書き込んでから、アトミックmv(移動)命令を使用することをお勧めします。

11

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

いくつかのプログラム(主にGNUバージョン)にはインプレースオプションがあります(例:-i PerlおよびGNU sed; -o on GNU sort)。彼らはデータを一時ファイルに入れ、それを所定の場所に移動することによって機能します。そのようなオプションがないプログラムの場合、 Colin WatsonのspongeユーティリティJoey Hessのmoreutils に含まれる)は、どのプログラムでも安全にジョブを実行します(例:- cutでファイルをその場で変更できますか? ; iconvで入力ファイルを変換された出力に置き換える方法はありますか? )。

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

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

使用する -oまたはvim-wayを試してください:

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