Cara mengurutkan file di tempat

205

Ketika kita menggunakan sort fileperintah, file memperlihatkan isinya dengan cara diurutkan bagaimana jika saya tidak ingin mendapatkan output apa pun selain file yang diurutkan?

Ali Sajid
sumber
Harap perbarui pertanyaan Anda untuk dengan jelas menjelaskan apa yang ingin Anda lakukan dengan hasil pengurutan file. Apakah Anda ingin menyortirnya di tempat, mengganti konten yang tidak disortir filedengan konten yang diurutkan dari file yang sama? Cara pertanyaan Anda saat ini dinyatakan, tidak melakukan apa-apa sama sekali adalah jawaban yang benar (Anda tidak ingin keluaran apa pun, jadi jangan lakukan apa-apa).
Keith Thompson
@KeithThompson terima kasih atas perhatian Anda sebenarnya, saya mencoba untuk mengurutkan file tetapi ingin menghindari output di layar.
Ali Sajid
Jadi ke mana Anda ingin outputnya pergi? Ke dalam file baru? Ke dalam file asli? Ke printer di ujung lorong?
Keith Thompson
1
Ke dalam file orignal
Ali Sajid
jalankan sort infile >outfiledan Anda akan mendapatkan output yang diurutkan ke dalam file "outfile". Kemudian Anda dapat menghapus "infile" asli dan semuanya akan beres.
Luis Colorado

Jawaban:

409

Anda dapat menggunakan pengalihan file untuk mengarahkan ulang hasil yang diurutkan:

sort input-file > output_file

Atau Anda dapat menggunakan -o, --output=FILEpilihan semacam untuk menunjukkan yang sama input dan output file:

sort -o file file

Catatan: Kesalahan umum adalah mencoba mengalihkan output ke file input yang sama (misalnya sort file > file). Ini tidak berfungsi karena shell membuat pengalihan (bukan program sort (1) ) dan file input (sebagai output juga) akan dihapus sebelum memberikan program sortir (1) kesempatan membacanya.

Sylvain Bugat
sumber
88
Catatan bagus untuk kesalahan umum
Drakes
1
Ini sangat berguna ketika Anda perlu mengedit kamus secara manual untuk LaTeX, +1
Bryson S.
6
Hanya untuk menyebutkan pentingnya pesanan. Dari GNU sorthalaman info: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Tulis output ke OUTPUT-FILE alih-alih output standar. Pada sistem yang lebih baru, -o' cannot appear after an input file if POSIXLY_CORRECT 'diatur, misalnya, sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' sebelum file input apa pun.
Yassine ElBadaoui
14
Untuk menghindari pengulangan nama file:sort -o file{,}
tstenner
65

The sortperintah mencetak hasil operasi penyortiran ke output standar secara default. Untuk mencapai jenis "di tempat", Anda dapat melakukan ini:

sort -o file file

Ini menimpa input filedengan output yang diurutkan. The -oswitch, digunakan untuk menentukan output, didefinisikan oleh POSIX , sehingga harus tersedia pada semua versi sort:

-o Tentukan nama file output yang akan digunakan, bukan output standar. File ini bisa sama dengan salah satu file input.

Jika Anda kurang beruntung memiliki versi sorttanpa -osaklar ( Luis meyakinkan saya bahwa mereka ada), Anda dapat mencapai hasil edit "di tempat" dengan cara standar:

sort file > tmp && mv tmp file
Tom Fenech
sumber
2
+ ^ untuk jawaban terbaik, dan dengan pertanyaan ambigu juga, tetapi masih di peringkat halaman atas sehingga perlu ditingkatkan.
u2n
6
sort file | sponge file

Ini ada dalam paket Fedora berikut:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge
SilverlightFox
sumber
1
Ini juga berfungsi di Ubuntu setelah menginstal dengansudo apt install moreutils
Serge Stroobandt
4

Untuk mengurutkan file di tempat, coba:

echo "$(sort your_file)" > your_file

Seperti yang dijelaskan dalam jawaban lain, Anda tidak dapat langsung mengarahkan kembali output ke file input. Tetapi Anda dapat mengevaluasi sortperintah pertama dan kemudian mengarahkannya kembali ke file asli. Dengan cara ini Anda bisa menerapkan pengurutan di tempat.

Demikian pula, Anda juga dapat menerapkan trik ini ke perintah lain seperti pasteuntuk menerapkan penambahan baris-bijaksana.

Bo Tian
sumber
1
Ini buruk karena tidak akan berfungsi untuk file besar, strip mengakhiri baris baru, echodapat mengacaukan backslash lolos di POSIX, dan -otidak bekerja untuk file yang sama dengan input seperti yang dijelaskan di: stackoverflow.com/a/29244387/895245
Ciro Santilli 郝海东冠状 病 六四 事件 法轮功
4

Inilah pendekatan yang (ab) gunakan vim:

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

The -c :sort -c :wqmemanggil porsi perintah untuk vim setelah file terbuka. -Edan -sdiperlukan agar vim dijalankan dalam mode "headless" yang tidak menarik ke terminal.

Ini hampir tidak ada manfaatnya daripada sort -o "${filename}" "${filename}"pendekatan kecuali bahwa hanya mengambil argumen nama file sekali.


Ini berguna bagi saya untuk menerapkan formatterarahan dalam nanorcentri untuk .gitignorefile. Inilah yang saya gunakan untuk itu:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
Anthony Sottile
sumber
4
Anda menggunakan vim di nanorc? Oh ironi itu.
Brett Holman
2

Apakah Anda ingin mengurutkan semua file dalam folder dan subfolder menimpanya?

Gunakan ini:

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