Apakah saya buta atau ada ada pilihan seperti --in-place
untuk sort
?
Untuk menyimpan hasil ke file input, sed menggunakan -i
( --in-place
).
Mengarahkan output sort
ke file input
sort < f > f
hasil membuatnya kosong. Jika tidak ada --in-place
pilihan - mungkin ada beberapa trik bagaimana melakukan ini dengan cara yang praktis ?
(Satu-satunya hal yang muncul di benak saya:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Pindah bukanlah pilihan yang tepat, karena izin file mungkin berubah. Itu sebabnya saya menimpa dengan isi file temp yang kemudian saya hapus.)
text-processing
sort
Grzegorz Wierzowiecki
sumber
sumber
insitu
, yang memungkinkan perintah apa pun untuk digunakan di tempat.sort
.Jawaban:
sort
memiliki-o, --output
opsi yang menggunakan nama file sebagai argumen. Jika sama dengan file input, ia menulis hasilnya ke file sementara, kemudian menimpa file input asli (persis sama dengan apa yangsed -i
dilakukan).Dari
GNU sort
halaman info:dan dari Spesifikasi Basis Grup Terbuka, Edisi 7 :
sumber
man sort
- apakah ini fitur tidak berdokumen? Apakah ini standar dan portabel?sort -o <filename> <filename>
akan dengan aman menyortir file di tempat.Anda dapat menggunakan
sponge
fungsi, yang pertama membasahistdin
dan kemudian menulisnya ke file, seperti:Kelemahan dari
sponge
ini adalah ia akan menyimpan output sementara dalam memori, yang dapat bermasalah untuk file besar. Kalau tidak, Anda harus menulisnya ke file terlebih dahulu dan kemudian menimpa file asli.Namun seperti yang ditunjukkan oleh jawaban lain, modifikasi di tempat pada umumnya bukan ide yang baik, karena di tengah-tengah proses (misalnya yang
sponge
), mesin mungkin macet dan kemudian Anda dapat kehilangan file asli dan baru. Anda lebih baik menulisnya ke file yang berbeda dan kemudian menggunakanmv
instruksi atom (bergerak).sumber
Berbahaya jika menimpa file input dengan file output, karena jika program atau sistem crash saat file sedang ditulis, Anda telah kehilangan keduanya.
Beberapa program (kebanyakan versi GNU) memiliki opsi in-place (misalnya
-i
pada perl dan GNU sed;-o
pada GNU sort). Mereka bekerja dengan meletakkan data dalam file sementara dan kemudian memindahkannya ke tempatnya. Untuk program yang tidak memiliki opsi tersebut, Colin Watsonsponge
utilitas (termasuk dalam MoreUtils Joey Hess ) melakukan pekerjaan dengan aman untuk setiap program (contoh: Dapatkah saya membuatcut
? Mengubah file di tempat ; Bagaimana saya bisa membuat iconv mengganti file input dengan dikonversi output? ).Hanya dalam kasus-kasus langka di mana Anda tidak dapat membuat kembali file asli dengan izin yang sama saya sarankan menimpa file di tempat. Dalam hal ini, Anda sebaiknya menyimpan input asli di suatu tempat. Dan kemudian Anda cukup memproses salinan input dan mengirimkannya ke file asli.
sumber
sort -o
bukan spesifik GNU, dan dirancang khusus untuk mengunggah file yang ada.sort
tidak dapat mulai menulis outputnya sebelum membaca inputnya sepenuhnya (menggunakan memori atau file sementara untuk menyimpan data), jadi itu datang secara alami bahwa itu harus dapat menimpa inputnya.sort
tidak POSIX karenasort -mo file1 file1 file2
tidak dijamin untuk bekerja sementara orang tradisionalsort
tahu bagaimana mengatasinya (dibaca di Unix V7 pada tahun 70-an).sort -o
bekerja untuk saya dengan coreutils 8.25 dan properti didokumentasikan dalam manual (mencatat bahwa itu hanya kasus ketika menyortir, bukan saat penggabungan). Jika Anda dapat mereproduksi ini, kirim laporan bug (menunjukkan baris perintah yang tepat, file input yang tepat, sistem tempat Anda menjalankannya, dan bagaimana Anda mendapatkan binernya).Gunakan
-o
atau coba vim-way:sumber