我需要使用 bash 脚本从一个巨大的文本文件中重复删除第一行。
现在我正在使用 sed -i -e "1d"$FILE
- 但删除大约需要一分钟。
有没有更有效的方法来完成这个?
最佳答案
尝试 tail :
tail -n +2 "$FILE"
-n x
:只打印最后的 x
行。 tail -n 5
会给你输入的最后 5 行。 +
符号会反转参数并使 tail
打印除前 x-1
行之外的任何内容。 tail -n +1
会打印整个文件,tail -n +2
除了第一行以外的所有内容,等等。
GNU tail
比 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 调用之前:
- Shell 截断文件
$FILE
- Shell 为
tail
创建一个新进程 - Shell 将
tail
进程的标准输出重定向到$FILE
tail
从空的$FILE
中读取
如果你想删除文件中的第一行,你应该使用:
tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"
&&
将确保文件在出现问题时不会被覆盖。
关于bash - 如何使用 bash/sed 脚本删除文本文件的第一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/339483/