GNU/Linux >> Linux の 問題 >  >> Linux

テキストファイルから最初の数行を効率的に削除しますか?

  • head /テール (パラメータとして指定した行の位置に応じて)ファイルのほぼ全体を反復処理する必要があります。
    次に、その結​​果を新しいファイルにコピーし、古いファイルを削除します。

  • sedかどうかわかりません ファイル全体を反復処理しますが、その結果を新しいファイルにコピーして、古いファイルを削除する必要があります。 -iでも (その場で)内部に一時ファイルを作成するので、同じことが当てはまります。

ファイルの最初の行を指すポインタを移動して、目的の行に移動してみませんか?

どうすればそのようなことができますか?私はCでやらなければなりませんか?他の方法はありますか?

それは理にかなっていますか ??私は間違って考えていますか?はいの場合、なぜですか?

承認された回答:

ファイルの最初の行を指すポインタを移動して、目的の行に移動してみませんか?

「ファイルの最初の行を指すポインタ」などがないためです。

ファイルを変更するための基本的な操作は、バイト範囲の上書き(つまり、一部を同じ長さのデータで置き換える)、追加(つまり、最後に追加)、切り捨て(つまり、最後から削除)です。

ほとんどのファイルシステムは、最後のブロックが部分的である可能性があることを除いて、ファイルを固定サイズのブロックに格納します。変更が最後にあるか、変更によってデータが整数ブロックシフトされる場合を除いて、変更によって変更対象のサイズが変更される場合は、データを適切に変更する方法はありません。整数のブロックでデータをシフトすることは偶然の一致によってのみ機能し、それを行うための広範なインターフェース¹はありません。

ファイルの先頭でデータを削除する最も効率的な方法は、保持する必要のあるデータを新しいファイルにコピーすることです。これがまさにtail-n +42 またはsed'41、$ p' します。

¹最近のLinuxシステムには、ファイルの一部を削除するシステムコールがあります: fallocate(fd、FALLOC_FL_COLLAPSE_RANGE、…) 、ユーティリティ fallocate--collapse-range=…を介して呼び出すことができます 。 FALLOC_FL_INSERT_RANGEもあります および--insert-range 。ただし、ブロックに制限されているため、テキストファイルにはほとんど役に立たず、すべてのファイルシステムで使用できるわけではありません。

関連:tiff画像のファイルヘッダーサイズを取得するにはどうすればよいですか?
Linux
  1. ファイル(タブとスペースを含む)から空白行を削除する方法は?

  2. 次の行の最初の文字に基づいて行を連結しますか?

  3. テキストファイル(Bash_historyなど)から「バイナリデータ」を削除するにはどうすればよいですか?

  1. 最初の行を除いて、ファイルから余分なヘッダー行を削除しますか?

  2. Linuxコマンドラインでファイルから特定の行を削除する

  3. テキスト ファイルから奇数行または偶数行を削除する

  1. bashスクリプトは、ファイルの最初の行にテキストを追加します.

  2. 非常に大きなテキスト ファイルの最後の 2 行を効率的に削除する

  3. Bash履歴ファイルから特定の行を削除します