我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
我需要使用bash脚本从一个巨大的文本文件中反复删除第一行。
现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。
有没有更有效的方法来实现这个目标?
当前回答
这一行代码可以做到:
echo "$(tail -n +2 "$FILE")" > "$FILE"
它可以工作,因为tail在echo之前执行,然后文件被解锁,因此不需要临时文件。
其他回答
你可以很容易地做到这一点:
cat filename | sed 1d > filename_without_first_line
在命令行上;或者要永久删除文件的第一行,使用sed的in-place模式,并带-i标志:
sed -i 1d <filename>
如果你想修改文件,你总是可以使用原始的ed,而不是它的流继承者sed:
ed "$FILE" <<<$'1d\nwq\n'
ed命令是最初的UNIX文本编辑器,当时还没有全屏终端,更不用说图形工作站了。ex编辑器,就是在vi中键入冒号提示符时所使用的编辑器,是ed的扩展版本,因此许多相同的命令都可以工作。虽然ed是用于交互的,但它也可以通过发送一串命令以批处理模式使用,这就是这个解决方案所做的。
序列<<<$'1d\nwq\n'利用了现代shell对here-strings(<<<)和ANSI引号($'…')的支持,将输入提供给由两行组成的ed命令:1d删除第一行,然后wq将文件写回磁盘,然后退出编辑会话。
这一行代码可以做到:
echo "$(tail -n +2 "$FILE")" > "$FILE"
它可以工作,因为tail在echo之前执行,然后文件被解锁,因此不需要临时文件。
正如帕克斯所说,你可能不会比这更快。原因是几乎没有文件系统支持从文件的开头截断,所以这将是一个O(n)操作,其中n是文件的大小。不过,您可以更快地做的是用相同数量的字节(可能是空格或注释)覆盖第一行,这可能对您有用,具体取决于您正在尝试做什么(顺便说一下,这是什么?)
可以使用sed命令按行号删除任意行
# create multi line txt file
echo """1. first
2. second
3. third""" > file.txt
删除行并打印到标准输出
$ sed '1d' file.txt
2. second
3. third
$ sed '2d' file.txt
1. first
3. third
$ sed '3d' file.txt
1. first
2. second
# delete multi lines
$ sed '1,2d' file.txt
3. third
# delete the last line
sed '$d' file.txt
1. first
2. second
使用-i选项就地编辑文件
$ cat file.txt
1. first
2. second
3. third
$ sed -i '1d' file.txt
$cat file.txt
2. second
3. third