web-dev-qa-db-ja.com

ファイルをその場でソートする方法

sort fileコマンドを使用すると、ファイルはその内容をソートされた方法で表示します。

159
Ali Sajid

ファイルリダイレクトを使用して、ソートされた出力をリダイレクトできます。

sort input-file > output_file

あるいは、-o--output=FILEオプションを使って同じ入力ファイルと出力ファイルを指定することもできます。

sort -o file file

注:よくある間違いは、出力を同じ入力ファイル(例えばsort file > file)にリダイレクトしようとすることです。シェルがリダイレクトを行っている(sort(1)プログラムではない)ためこれは機能しません。入力ファイル(出力でもあるので)はsortを与える直前に消去されます) (1)それを読む機会をプログラムします。

323
Sylvain Bugat

sortコマンドは、デフォルトでソート操作の結果を標準出力に出力します。 「インプレース」ソートを達成するために、これをすることができます:

sort -o file file

これは入力fileをソートされた出力で上書きします。出力を指定するために使用される-oスイッチ POSIXで定義されています 、すべてのバージョンのsortで使用可能になります。

-o標準出力の代わりに使用される出力ファイルの名前を指定します。このファイルは、入力ファイルと同じものにすることができます。

-oスイッチなしでsortのバージョンを持つことができないほど残念な場合( Luis が存在することを保証します)、標準的な方法で "インプレース"編集を実現できます。

sort file > tmp && mv tmp file
46
Tom Fenech

ファイルをその場でソートするには、次のことを試してください。

echo "$(sort your_file)" > your_file

他の回答で説明したように、出力を直接入力ファイルにリダイレクトすることはできません。しかし、最初にsortコマンドを評価してから元のファイルにリダイレクトすることができます。このようにして、インプレースソートを実装できます。

同様に、このトリックをpasteのような他のコマンドに適用して行単位の追加を実装することもできます。

2
Bo Tian

これは(ab)がvimを使うアプローチです:

vim -c :sort -c :wq -E -s "${filename}"

-c :sort -c :wq部分はファイルが開いた後にvimにコマンドを呼び出します。 vimが端末を引き寄せない「ヘッドレス」モードで実行するためには、-E-sが必要です。

これはsort -o "${filename}" "${filename}"アプローチよりもほとんど利点がありません。ただし、filename引数を一度だけ取るという点が異なります。


これは私にとって.gitignoreファイルのformatterエントリにnanorcディレクティブを実装するのに役立ちました。これが私がそのために使ったものです:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
2
Anthony Sottile
sort file | sponge file

これは以下のFedoraパッケージにあります。

moreutils : Additional unix utilities
Repo        : Fedora
Matched from:
Filename    : /usr/bin/sponge
1
SilverlightFox

それらをオーバーライドしているフォルダーとサブフォルダー内のすべてのファイルをソートしますか?

これを使って:

find . -type f -exec sort {} -o {} \;
0
luandrea