我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
当前回答
你可以编辑文件:使用perl的-i标志,像这样:
perl -ni -e 'print unless $. == 1' filename.txt
这将使第一行消失。Perl将需要读取和复制整个文件,但是它会将输出保存在原始文件的名称下。
其他回答
对于那些使用非gnu的SunOS的人来说,下面的代码将会有所帮助:
sed '1d' test.dat > tmp.dat
你可以很容易地做到这一点:
cat filename | sed 1d > filename_without_first_line
在命令行上;或者要永久删除文件的第一行,使用sed的in-place模式,并带-i标志:
sed -i 1d <filename>
可以使用vim这样做:
vim -u NONE +'1d' +'wq!' /tmp/test.txt
这应该更快,因为vim在处理时不会读取整个文件。
正如帕克斯所说,你可能不会比这更快。原因是几乎没有文件系统支持从文件的开头截断,所以这将是一个O(n)操作,其中n是文件的大小。不过,您可以更快地做的是用相同数量的字节(可能是空格或注释)覆盖第一行,这可能对您有用,具体取决于您正在尝试做什么(顺便说一下,这是什么?)
因为听起来我不能加快删除,我认为一个好的方法可能是像这样批量处理文件:
While file1 not empty
file2 = head -n1000 file1
process file2
sed -i -e "1000d" file1
end
这样做的缺点是,如果程序在中间被杀死(或者如果其中有一些糟糕的sql -导致“进程”部分死亡或锁定),将会有行被跳过,或者被处理两次。
(file1包含SQL代码行)