我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
当前回答
海绵util避免了对临时文件的杂耍:
tail -n +2 "$FILE" | sponge "$FILE"
其他回答
如果您要做的是在失败后恢复,那么您可以构建一个包含迄今为止所做的工作的文件。
if [[ -f $tmpf ]] ; then
rm -f $tmpf
fi
cat $srcf |
while read line ; do
# process line
echo "$line" >> $tmpf
done
你可以编辑文件:使用perl的-i标志,像这样:
perl -ni -e 'print unless $. == 1' filename.txt
这将使第一行消失。Perl将需要读取和复制整个文件,但是它会将输出保存在原始文件的名称下。
这一行代码可以做到:
echo "$(tail -n +2 "$FILE")" > "$FILE"
它可以工作,因为tail在echo之前执行,然后文件被解锁,因此不需要临时文件。
在N-1行上使用tail并将其定向到一个文件中,然后删除旧文件,并将新文件重命名为旧名称,这样做可以吗?
如果我以编程方式执行此操作,我将读取文件,并在读取每一行后记住文件偏移量,因此我可以查找回该位置以读取文件中少一行的文件。
如果你想修改文件,你总是可以使用原始的ed,而不是它的流继承者sed:
ed "$FILE" <<<$'1d\nwq\n'
ed命令是最初的UNIX文本编辑器,当时还没有全屏终端,更不用说图形工作站了。ex编辑器,就是在vi中键入冒号提示符时所使用的编辑器,是ed的扩展版本,因此许多相同的命令都可以工作。虽然ed是用于交互的,但它也可以通过发送一串命令以批处理模式使用,这就是这个解决方案所做的。
序列<<<$'1d\nwq\n'利用了现代shell对here-strings(<<<)和ANSI引号($'…')的支持,将输入提供给由两行组成的ed命令:1d删除第一行,然后wq将文件写回磁盘,然后退出编辑会话。