我需要使用 bash 脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed -i -e "1d" $FILE- 但删除大约需要一分钟。
sed -i -e "1d" $FILE
有没有更有效的方法来实现这一点?
试试尾巴:
tail -n +2 "$FILE"
-n x: 只打印最后x几行。tail -n 5会给你输入的最后 5 行。+符号类型反转参数并tail打印除第一x-1行以外的任何内容。tail -n +1将打印整个文件,tail -n +2除第一行外的所有内容等。
-n x
x
tail -n 5
+
tail
x-1
tail -n +1
tail -n +2
GNUtail比sed. tail在 BSD 上也可以使用,并且-n +2标志在两个工具中是一致的。查看FreeBSD或OS X手册页以获取更多信息。
sed
-n +2
不过,BSD 版本可能比sed. 我想知道他们是如何做到的;tail应该只逐行读取文件,同时sed执行非常复杂的操作,包括解释脚本、应用正则表达式等。
注意:您可能很想使用
# THIS WILL GIVE YOU AN EMPTY FILE! tail -n +2 "$FILE" > "$FILE"
但这会给你一个 空文件 。原因是重定向 ( >) 发生在tailshell 调用之前:
>
$FILE
如果要删除文件中的第一行,应使用:
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
这&&将确保文件在出现问题时不会被覆盖。
&&