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

テキストファイルから最初の数行を効率的に削除する
  • head/はtailほぼファイル全体を繰り返す必要があります(引数として提供する行の位置によって異なります)。次に、結果を新しいファイルにコピーし、古いファイルを削除します。

  • ファイル全体が繰り返されるかどうかはわかりませんが、sed結果を新しいファイルにコピーして古いファイルを削除する必要があります。-i(その場で)バックグラウンドに一時ファイルを作成するため、同じことが当てはまります。

ポインタをファイルの最初の行に移動し、目的の行に移動するとどうなりますか?

どうすればそのようなことができますか?ぜひCにしなければなりませんか?別の方法がありますか?

馬になる? ?私は間違っていますか?それではなぜ?

ベストアンサー1

ポインタをファイルの最初の行に移動し、目的の行に移動するとどうなりますか?

「ファイルの最初の行へのポインタ」のようなものがないからです。

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

ほとんどのファイルシステムはファイルを固定サイズのブロックに保存しますが、最後のブロックは部分的にすることができます。変更によって変更中の項目のサイズが変更された場合、変更が完了しない場合、または変更によってデータが整数ブロック数だけ移動しない限り、データはその場で変更できません。ブロック全体にわたってデータを移動することは偶然の問題であり、これを実行するための広範なインターフェースはありません。

ファイルの先頭からデータを削除する最も効率的な方法は、アーカイブしたいデータを新しいファイルにコピーすることです。これが「何をすべきか」tail -n +42または「sed '41,$p'何をすべきか」です。

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

おすすめ記事