GNU/Linux >> Belajar Linux >  >> Linux

Hapus Beberapa Baris Pertama Secara Efisien Dari File Teks?

  • 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.

Terkait:Bagaimana cara mendapatkan ukuran header file dari gambar tiff?
Linux
  1. Bagaimana Cara Menghapus Garis Duplikat Di Dalam File Teks?

  2. Bagaimana Cara Menyisipkan Teks Sebelum Baris Pertama Sebuah File?

  3. Hapus Baris Header Ekstra Dari File, Kecuali Baris Pertama?

  1. Menghapus Baris Tertentu dari File di Baris Perintah Linux

  2. Hapus baris kosong dalam file teks melalui grep

  3. Bagaimana cara menghapus baris baru dari file teks?

  1. skrip bash menambahkan teks ke baris pertama file

  2. Hapus dua baris terakhir dari file teks yang sangat besar secara efisien

  3. Hapus baris tertentu dari file riwayat Bash