我需要使用bash脚本从巨大的文本文件中反复删除第一行。目前,我正在使用sed -i -e "1d" $FILE-但删除大约需要一分钟。有没有更有效的方法来实现这一目标?
3 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
试试tail:
tail -n +2 "$FILE"
-n x:仅打印最后x几行。tail -n 5将为您提供输入的最后5行。该+标志那种反转的争论,使tail打印任何东西,但第一x-1线。tail -n +1将打印整个文件,tail -n +2除了第一行以外的所有内容,等等。
GNU tail比.NET 快得多sed。tail在BSD上也可用,并且-n +2标记在两个工具之间是一致的。有关更多信息,请参见FreeBSD或OS X手册页。
BSD版本可能比慢得多sed。我想知道他们是如何做到的;tail应该只逐行读取文件,同时sed执行相当复杂的操作,包括解释脚本,应用正则表达式等。
注意:您可能会想使用
# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"
但这会给你一个空文件。原因是重定向(>)发生在tail外壳程序调用之前:
Shell截断文件 $FILE
壳牌为 tail
Shell将tail流程的标准输出重定向到$FILE
tail 从现在的空读取 $FILE
如果要删除文件中的第一行,则应使用:
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
在&&将确保该文件不被覆盖时,有一个问题。
- 3 回答
- 0 关注
- 974 浏览
添加回答
举报
0/150
提交
取消