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

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

大きなファイルでこれを試して速度を確認したことはありませんが、かなり高速になるはずです。

スクリプトを使用してファイルの末尾から行を削除するには:

./shorten.py 2 large_file.txt

ファイルの最後までシークし、最後の文字が改行であることを確認してから、3 つの改行が見つかるまで各文字を 1 つずつ逆方向に読み取り、その直後でファイルを切り捨てます。変更が適切に行われます。

編集: 一番下に Python 2.4 バージョンを追加しました。

Python 2.5/2.6 のバージョンは次のとおりです:

#!/usr/bin/env python2.5
from __future__ import with_statement
# also tested with Python 2.6

import os, sys

if len(sys.argv) != 3:
    print sys.argv[0] + ": Invalid number of arguments."
    print "Usage: " + sys.argv[0] + " linecount filename"
    print "to remove linecount lines from the end of the file"
    exit(2)

number = int(sys.argv[1])
file = sys.argv[2]
count = 0

with open(file,'r+b') as f:
    f.seek(0, os.SEEK_END)
    end = f.tell()
    while f.tell() > 0:
        f.seek(-1, os.SEEK_CUR)
        char = f.read(1)
        if char != '\n' and f.tell() == end:
            print "No change: file does not end with a newline"
            exit(1)
        if char == '\n':
            count += 1
        if count == number + 1:
            f.truncate()
            print "Removed " + str(number) + " lines from end of file"
            exit(0)
        f.seek(-1, os.SEEK_CUR)

if count < number + 1:
    print "No change: requested removal would leave empty file"
    exit(3)

Python 3 バージョンは次のとおりです:

#!/usr/bin/env python3.0

import os, sys

if len(sys.argv) != 3:
    print(sys.argv[0] + ": Invalid number of arguments.")
    print ("Usage: " + sys.argv[0] + " linecount filename")
    print ("to remove linecount lines from the end of the file")
    exit(2)

number = int(sys.argv[1])
file = sys.argv[2]
count = 0

with open(file,'r+b', buffering=0) as f:
    f.seek(0, os.SEEK_END)
    end = f.tell()
    while f.tell() > 0:
        f.seek(-1, os.SEEK_CUR)
        print(f.tell())
        char = f.read(1)
        if char != b'\n' and f.tell() == end:
            print ("No change: file does not end with a newline")
            exit(1)
        if char == b'\n':
            count += 1
        if count == number + 1:
            f.truncate()
            print ("Removed " + str(number) + " lines from end of file")
            exit(0)
        f.seek(-1, os.SEEK_CUR)

if count < number + 1:
    print("No change: requested removal would leave empty file")
    exit(3)

これは Python 2.4 バージョンです:

#!/usr/bin/env python2.4

import sys

if len(sys.argv) != 3:
    print sys.argv[0] + ": Invalid number of arguments."
    print "Usage: " + sys.argv[0] + " linecount filename"
    print "to remove linecount lines from the end of the file"
    sys.exit(2)

number = int(sys.argv[1])
file = sys.argv[2]
count = 0
SEEK_CUR = 1
SEEK_END = 2

f = open(file,'r+b')
f.seek(0, SEEK_END)
end = f.tell()

while f.tell() > 0:
    f.seek(-1, SEEK_CUR)
    char = f.read(1)
    if char != '\n' and f.tell() == end:
        print "No change: file does not end with a newline"
        f.close()
        sys.exit(1)
    if char == '\n':
        count += 1
    if count == number + 1:
        f.truncate()
        print "Removed " + str(number) + " lines from end of file"
        f.close()
        sys.exit(0)
    f.seek(-1, SEEK_CUR)

if count < number + 1:
    print "No change: requested removal would leave empty file"
    f.close()
    sys.exit(3)

GNU head を試すことができます

head -n -2 file

私の Debian Squeeze/testing システム (Lenny/stable ではない) には、「coreutils」パッケージの一部として「truncate」コマンドが含まれています。

それを使用すると、次のようなことが簡単にできます

truncate --size=-160 myfile

ファイルの末尾から 160 バイトを削除します (削除する必要がある文字数を正確に把握する必要があることは明らかです)。


Linux
  1. テキストファイル内の重複行を削除するにはどうすればよいですか?

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

  3. 2つの特定の行の間にテキストを抽出しますか?

  1. 2つのテキストファイル(差分の反対側)の共通行(類似点)を出力しますか?

  2. 大きなファイルの行数を数える

  3. 文字列の最初の出現から始めて、大きなファイルからテキストを抽出する方法は?

  1. Utf-8ファイルからBOMを削除する方法は?

  2. 最初と最後の行なしでファイルコンテンツを印刷しますか?

  3. grep でテキスト ファイルの空行を削除する