Edit baris pertama file teks besar

16

Saya memiliki file teks yang sangat besar, terlalu besar untuk disimpan dalam memori. Yang perlu saya lakukan dengan file teks ini adalah mengedit baris pertama (ini file CSV dan saya perlu mengubah judul).

Apakah ada cara sederhana yang bisa saya lakukan dalam bash?

lynks
sumber
Apakah ada alasan mengapa Anda tidak bisa menggunakan editor teks saja?
dangph
File ini terlalu besar, lebih dari 20 kali lebih besar dari memori virtual maksimum saya pada mesin ini.
lynks
1
cukup adil. Saya mendapat kesan bahwa editor teks yang baik dapat menangani file yang sangat besar karena mereka hanya memuat sebanyak yang mereka butuhkan ke dalam memori, tetapi setelah membaca beberapa pertanyaan lain tampaknya sebagian besar dari mereka memiliki masalah dengan mereka.
dangph
@dangph Benar ... mungkin aneh tetapi "editor teks" yang lama dan usang (atau disebut) seperti edlinuntuk ms-dos atau eduntuk Unix tampaknya tidak memiliki masalah ini tetapi di mana hanya editor baris ... RAM di kali ini adalah hal yang langka dan berharga dan ukuran file dalam Gigabytes adalah sesuatu yang mustahil untuk dipercaya! ;)
laurent
Agar semuanya jelas;): Saya TIDAK ketinggalan ed!!! tetapi akan cocok untuk kasus ini (tidak yakin bisa menangani file dengan ukuran ini ...)
laurent

Jawaban:

20

Anda dapat menggunakan lessuntuk melihat apa yang ingin Anda edit dan gunakan seduntuk melakukan perubahan. Dengan cara ini Anda mengedit tanpa memuat seluruh file.

Cara lain adalah dengan membagi file, mengedit, dan bergabung lagi:

split -b 10000k <file>

and to join:

cat xa* > <file>
laurent
sumber
memilih untuk sed.
atroon
Fantastis, terpecah dan bergabung adalah persis apa yang saya cari, terima kasih.
lynks
tentu, sed lebih baik karena dapat mencari / mengganti seluruh file dengan mudah tetapi jika dia hanya perlu mengubah baris pertama, split tidak buruk dan lebih cepat juga.
laurent
4
sed akan membutuhkan waktu berjam-jam untuk menjalankan seluruh file (yang hanya di bawah setengah TB), perubahan hanya pada baris pertama, membaginya tampak masuk akal.
lynks
3

Jika modifikasi Anda mengubah panjang baris, seluruh file perlu ditulis ulang, lihat misalnya diskusi ini di SO. Anda mungkin harus mempertimbangkan untuk menyimpan data ke database.

Dengan mengingat hal itu, Anda dapat melakukan streaming mengedit file dengan sed. Untuk mengganti baris pertama, lakukan sesuatu seperti ini (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Thor
sumber