有人可以給如何從在Perl文件中刪除最後一個n行一些提示?我有一個大約400 MB的非常大的文件,我想從中刪除約125,000條最後一行。如何刪除一個文件的最後N行?
回答
您可以使用Tie::File處理文件作爲一個數組。
use Tie::File; tie (@File, 'Tie::File', $Filename); splice (@File, -125000, 125000); untie @File;
另一種方法是在殼使用head
和wc -l
。
編輯: grepsedawk讓我們想起了-n
選項head
的,沒有必要wc
:
head -n -125000 FILE > NEWFILE
你知道有多少行有,或有關於這個文件的任何其他線索?你是否必須重複這樣做,還是隻是一次?
如果我不得不這樣做一次,我會加載VIM文件,看最後的行號,然後從最後一行我想,直到最後刪除:
:1234567,$d
的總體規劃辦法是做它在兩個通道:一個確定的行數,再一個擺脫線。
最簡單的方法是打印的行權數量爲一個新文件。這是唯一有效的循環,也許有點磁盤顛簸的條款,但大多數人有很多這樣的。 perlfaq5中的一些內容應該有所幫助。你完成了這項工作,並且繼續生活。
while() { print $out; last if $. > $last_line_I_want; }
如果這是你必須做很多或數據量太大,重寫它的東西,你可以創建線條和字節偏移和truncate()文件到合適大小的指標。當你保持索引時,你只需要發現新的行結尾,因爲你已經知道你離開的地方。一些文件處理模塊可以爲你處理所有這些。
- 轉到文件的末尾:FSEEK
- 計數向後多行
- 查出文件位置:FTELL
- 截斷該文件到該位置的長度:ftruncate
我只是用這個問題的shell腳本:
tac file | sed '1,125000d' | tac
(tac就像貓一樣,但以相反的順序打印行。由Jay Lepreau和David MacKenzie撰寫。部分GNU coreutils)
最有效的方法是查找文件末尾,然後逐漸增加讀取段,同時計算每行中的換行數,然後使用truncate(請參閱perldoc -f truncate)修剪它。 CPAN上還有一個或兩個模塊用於向後讀取文件。
由於人們已經建議Tie :: Array,它能很好地完成這項工作,所以如果您想手動完成這項工作,我會列出基本算法。有一些草率的,慢的方法可以很好地處理小文件。以下是對大文件執行此操作的有效方法。
- 從結尾找到第N行之前文件中的位置。
- 截斷該點後的所有內容(使用
truncate()
)。
1是棘手的部分。我們不知道文件中有多少行或者它們在哪裏。一種方法是統計所有線路,然後返回到第N個。這意味着我們必須每次掃描整個文件。效率更高的是從文件末尾向後讀取。您可以使用read()
來做到這一點,但使用File::ReadBackwards可以更容易地逐行倒退(仍然使用高效的緩衝讀取)。
這意味着您只讀取125,000行而不是整個文件。 truncate()
應該是O(1)和原子,並且無論文件有多大都幾乎不需要花費。它只是重置文件的大小。
#!/usr/bin/perl
use strict;
use warnings;
use File::ReadBackwards;
my $LINES = 10; # Change to 125_000 or whatever
my $File = shift; # file passed in as argument
my $rbw = File::ReadBackwards->new($File) or die $!;
# Count backwards $LINES or the beginning of the file is hit
my $line_count = 0;
until($rbw->eof || $line_count == $LINES) {
$rbw->readline;
$line_count++;
}
# Chop off everything from that point on.
truncate($File, $rbw->tell) or die "Could not truncate! $!";
Schwern擁有:是use Fnctl
和$rbw->get_handle
線在你的腳本有必要嗎?另外,如果它不返回true,我建議報告truncate
錯誤。
- 道格拉斯獵人(誰又能對崗位評價,如果他能有)
試試這個代碼:
我的$ I = 0;
sed -i'\ $ d'filename while($ i ++ < n);
反引號也將在那裏,但我不能讓他們打印:(
試試這個
:|dd of=urfile seek=1 bs=$(($(stat -c%s urfile)-$(tail -1 urfile|wc -c)))
我的建議,使用ed
:
printf '$-125000,$d\nw\nq\n' | ed -s myHugeFile
這個例子代碼將保留最後10行的索引,因爲它會掃描文件,然後使用最早的索引i在緩衝區中,截斷文件。這當然只會在截斷在你的系統上工作時才起作用。
#! /usr/bin/env perl
use strict;
use warnings;
use autodie;
open my $file, '+<', 'test.in'; # rw
my @list;
while(<$file>){
if(@list <= 10){
push @list, tell $file;
}else{
(undef,@list) = (@list,tell $file);
}
}
seek $file, 0, 0;
truncate $file, $list[0] if @list;
close $file;
這有額外的好處,它僅使用了在過去的十年指標足夠的內存,並且當前行。
- 1. 如何刪除大(大)文件中的最後N行
- 2. 如何刪除最後一個新行(\ n)
- 3. 從textarea刪除最後一個「\ n」
- 4. 刪除文件的最後一行
- 5. batfile - 如何刪除文件中的最後一行,空行?
- 6. 如何刪除Java中文本文件的最後一行?
- 7. 向下移動一行,刪除最後一行的值n行
- 8. 如何刪除UITextView的最後一行?
- 9. 如何刪除csv文件中的第一個X和最後一個X行?
- 10. 從每個文本文件中刪除最後一個空行
- 11. 如何在scala中刪除文件的最後一行?
- 12. 如何刪除文件的最後一行在UNIX
- 13. 如何使用php刪除文件的最後一行?
- 14. 如何刪除Ruby中的最後一行文件?
- 15. 使用批次刪除文件的最後n個字符
- 16. 如何刪除最後一個文本的換行符
- 17. 從文件bash中刪除最後N行
- 18. 通過id刪除最後n行0,然後通過R刪除最後n個元素
- 19. PHP腳本刪除除最後n行之外的所有行文件
- 20. SQL爲每個唯一值刪除除最後N行之外的所有行
- 21. 從文件中刪除最後N個字節
- 22. Android - 刪除.txt文件中最後一個不完整的行
- 23. 刪除dataGridView的最後一個空行
- 24. 如何從文件的每一行刪除最後一行以外的逗號?
- 25. 如何刪除一行的最後一個元素的邊距
- 26. 如何從文本文件中刪除第一行和最後一行c#?
- 27. 刪除最後一個文件夾的htaccess後一切
- 28. 如何刪除最後一個空格後的文本?
- 29. 如何刪除最後一個UITableViewCell
- 30. 如何刪除最後一個字符
這應該是一個常見問題。等一下,等一下。 *類型類型提交*。現在它在perlfaq5中。 :) – 2009-10-20 07:02:40