如何使用bash / sed脚本删除文本文件的第一行?

我需要使用bash脚本从一个巨大的文本文件中重复删除第一行。

现在我正在使用sed -i -e "1d" $FILE - 但删除操作大约需要一分钟。

有没有更有效的方法来实现这一点?


尝试GNU tail:

tail -n +2 "$FILE"

-nx :只需打印最后的x行。 tail -n 5会给你输入的最后5行。 +符号类型颠倒了参​​数并使tail打印了除第一个x-1行之外的任何内容。 tail -n +1会打印整个文件, tail -n +2除第一行之外的所有内容

GNU tailsed快得多。 tail也可以在BSD上使用,并且-n +2标志在两个工具中都是一致的。 查看FreeBSD或OS X手册页以获取更多信息。

不过,BSD版本可能比sed慢得多。 我想知道他们是如何管理的; tail应该只是逐行读取一个文件,而sed执行相当复杂的操作,包括解释脚本,应用正则表达式等等。

注意:您可能会尝试使用

# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"

但是这会给你一个空文件 。 原因是重定向( > )在shell调用tail之前发生:

  • Shell截断文件$FILE
  • Shell为tail创建一个新的过程
  • Shell将tail进程的stdout重定向到$FILE
  • tail从现在空的$FILE读取
  • 如果你想删除文件中的第一行,你应该使用:

    tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
    

    &&将确保文件在出现问题时不会被覆盖。


    您可以使用-i在不使用'>'操作符的情况下更新文件。 以下命令将从文件中删除第一行并将其保存到文件中。

    sed -i '1d' filename
    

    对于那些非GNU的SunOS,以下代码将有所帮助:

    sed '1d' test.dat > tmp.dat 
    
    链接地址: http://www.djcxy.com/p/77059.html

    上一篇: How can I remove the first line of a text file using bash/sed script?

    下一篇: Creating indexes with Entity Framework 6 Migrations