我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
当前回答
不,这是你能得到的最高效率。您可以编写一个C程序,它可以更快地完成这项工作(更少的启动时间和处理参数),但随着文件变大,它可能会趋向于与sed相同的速度(如果需要一分钟,我就假定它们很大)。
但是你的问题和其他问题一样,都是以解决方案为前提的。如果你能详细地告诉我们你正在尝试做什么,而不是如何做,我们可能会提出一个更好的选择。
例如,如果这是一个由其他程序B处理的文件a,一种解决方案是不去掉第一行,而是修改程序B以不同的方式处理它。
假设您的所有程序都附加到这个文件A,程序B当前在删除它之前读取并处理第一行。
您可以重新设计程序B,这样它就不会试图删除第一行,而是在文件a中维护一个持久的(可能是基于文件的)偏移量,以便下次运行时,它可以查找该偏移量,处理那里的行,并更新偏移量。
然后,在一个安静的时间(午夜?),它可以对文件a进行特殊处理,删除当前处理的所有行,并将偏移量设置为0。
对于程序来说,打开并查找文件肯定比打开并重写要快。当然,这个讨论假设您可以控制程序B。我不知道是不是这样,但如果你提供进一步的信息,也许还有其他可能的解决方案。
其他回答
在N-1行上使用tail并将其定向到一个文件中,然后删除旧文件,并将新文件重命名为旧名称,这样做可以吗?
如果我以编程方式执行此操作,我将读取文件,并在读取每一行后记住文件偏移量,因此我可以查找回该位置以读取文件中少一行的文件。
海绵util避免了对临时文件的杂耍:
tail -n +2 "$FILE" | sponge "$FILE"
tail +2 path/to/your/file
适用于我,不需要指定-n标志。原因请看Aaron的回答。
正如帕克斯所说,你可能不会比这更快。原因是几乎没有文件系统支持从文件的开头截断,所以这将是一个O(n)操作,其中n是文件的大小。不过,您可以更快地做的是用相同数量的字节(可能是空格或注释)覆盖第一行,这可能对您有用,具体取决于您正在尝试做什么(顺便说一下,这是什么?)
您可以使用-i来更新文件,而不使用'>'操作符。下面的命令将从文件中删除第一行并将其保存到文件中(在幕后使用临时文件)。
sed -i '1d' filename