-
head
/tail
perlu mengulang hampir seluruh file (tergantung pada posisi baris yang Anda berikan sebagai parameter).
Kemudian Anda menyalin hasilnya ke file baru dan menghapus yang lama. -
Saya tidak yakin apakah
sed
akan mengulangi seluruh file tetapi Anda perlu menyalin hasilnya ke file baru dan menghapus yang lama. Bahkan dengan-i
(di tempat) itu membuat file sementara di bawah tenda, jadi hal yang sama berlaku.
Mengapa tidak memindahkan pointer yang menunjuk ke baris pertama file dan memindahkannya ke baris yang kita inginkan?
Bagaimana kita bisa melakukan hal seperti itu? Apakah saya harus melakukan di C? Apakah ada cara lain?
Apakah itu masuk akal ?? Saya berpikir salah? Jika ya mengapa?
Jawaban yang Diterima:
Mengapa tidak memindahkan pointer yang menunjuk ke baris pertama file dan memindahkannya ke baris yang kita inginkan?
Karena tidak ada yang namanya "pointer yang menunjuk ke baris pertama file".
Operasi dasar untuk memodifikasi file adalah:menimpa rentang byte (yaitu mengganti sebagian dengan data dengan panjang yang sama), menambahkan (yaitu menambahkan di akhir), truncate (yaitu menghapus dari akhir).
Sebagian besar sistem file menyimpan file dalam blok berukuran tetap, kecuali blok terakhir mungkin sebagian. Tidak ada cara untuk mengubah data yang ada jika modifikasi akan mengubah ukuran dari apa yang dimodifikasi, kecuali jika perubahan tersebut di akhir atau modifikasi akan menggeser data dengan jumlah blok yang utuh. Memindahkan data dengan sejumlah blok hanya akan berhasil secara kebetulan, dan tidak ada antarmuka yang tersebar luas¹ untuk melakukannya.
Cara paling efisien untuk menghapus data di awal file adalah dengan menyalin data yang perlu disimpan ke file baru. Tepatnya apa tail -n +42
atau sed '41,$p'
lakukan.
Sistem Linux modern memiliki panggilan sistem untuk menghapus sebagian file:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …)
, yang dapat Anda panggil melalui utilitas fallocate --collapse-range=…
. Ada juga FALLOC_FL_INSERT_RANGE
dan --insert-range
. Tetapi mereka terbatas pada blok, yang membuatnya sebagian besar tidak berguna untuk file teks, dan mereka tidak tersedia dengan semua sistem file.