インプレースでファイルを並べ替える方法


205

sort fileコマンドを使用すると、ファイルはその内容をソートされた方法で表示します。何らかの種類の出力を取得したくないが、ソートされたファイルがある場合はどうなりますか?


質問を更新して、ファイルのソート結果で何をしたいかを明確に説明してください。並べ替えて、の並べ替えられていないコンテンツをfile同じファイルの並べ替えられたコンテンツで置き換えますか?あなたの質問が現在述べられている方法で、何もしないことは正解です(あなたは何も出力したくないので何もしないでください)。
キーストンプソン

@KeithThompson懸念をお寄せいただきありがとうございます。ファイルを並べ替えようとしましたが、画面に出力されないようにしたいと考えています。
Ali Sajid 2015年

では、どこに出力したいですか?新しいファイルに?元のファイルに?ホールのプリンタまで?
キース・トンプソン

1
元のファイルに
Ali Sajid 2015年

実行するsort infile >outfileと、ソートされた出力がファイル「outfile」に取得されます。その後、元の「infile」を消去すると、すべてが正常になります。
Luis Colorado

回答:


409

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

sort input-file > output_file

または、並べ替えの-o--output=FILEオプションを使用して、同じ入力ファイルと出力ファイルを示すことができます。

sort -o file file

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


88
よくある間違いについての良い注記
Drakes

1
LaTeXの辞書を手動で編集する必要がある場合、これは本当に便利です、+ 1
Bryson S.

6
順序の重要性に言及するだけです。GNU sort情報ページから: -o OUTPUT-FILE' --output = OUTPUT-FILE '標準出力の代わりにOUTPUT-FILEに出力を書き込みます。新しいシステムでは、-o' cannot appear after an input file if POSIXLY_CORRECT 'が設定されsort F -o F'. Portable scripts should specify ます。たとえば、入力ファイルの前に-o OUTPUT-FILE' が設定されます。
Yassine ElBadaoui 2017年

14
ファイル名のsort -o file{,}
重複

65

このsortコマンドは、デフォルトでソート操作の結果を標準出力に出力します。「インプレース」ソートを実現するには、次のようにします。

sort -o file file

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

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

残念なことにsort-oスイッチなしのバージョン(Luisはそれらが存在することを保証します)のバージョンを持っている場合は、標準的な方法で「インプレース」編集を行うことができます。

sort file > tmp && mv tmp file

2
+ ^最良の回答を得るため、そしてあいまいな質問もあるが、それでもトップページのランクにあるため、ブーストが必要。
u2n

6
sort file | sponge file

これは次のFedoraパッケージにあります:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
これはUbuntuでも動作しますsudo apt install moreutils
Serge Stroobandt '

4

ファイルを所定の場所に並べ替えるには、次のことを試してください。

echo "$(sort your_file)" > your_file

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

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


1
これは、大きなファイルの作業、改行を終了ストリップ、ないので悪いechoPOSIXにバックスラッシュエスケープと缶混乱、および-oで説明したように、入力と同じファイルに対して作業を行います。stackoverflow.com/a/29244387/895245
チロSantilli郝海东冠状病六四事件法轮功

4

これが(ab)使用するアプローチvimです:

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

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

これはsort -o "${filename}" "${filename}"、filename引数を1回しか受け取らないことを除いて、アプローチに比べてほとんど利点がありません。


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

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
あなたはあなたの中でvimを使用していますnanorcか?皮肉なこと。
ブレットホルマン

2

フォルダとサブフォルダ内のすべてのファイルを上書きして、それらを上書きしますか?

これを使って:

find . -type f -exec sort {} -o {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.