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

现在我正在使用sed - I -e "1d" $FILE -但它需要大约一分钟的时间来删除。

有没有更有效的方法来实现这个目标?


当前回答

可以使用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

其他回答

在N-1行上使用tail并将其定向到一个文件中,然后删除旧文件,并将新文件重命名为旧名称,这样做可以吗?

如果我以编程方式执行此操作,我将读取文件,并在读取每一行后记住文件偏移量,因此我可以查找回该位置以读取文件中少一行的文件。

您可以使用-i来更新文件,而不使用'>'操作符。下面的命令将从文件中删除第一行并将其保存到文件中(在幕后使用临时文件)。

sed -i '1d' filename

应该显示除第一行以外的其他行:

cat textfile.txt | tail -n +2

正如帕克斯所说,你可能不会比这更快。原因是几乎没有文件系统支持从文件的开头截断,所以这将是一个O(n)操作,其中n是文件的大小。不过,您可以更快地做的是用相同数量的字节(可能是空格或注释)覆盖第一行,这可能对您有用,具体取决于您正在尝试做什么(顺便说一下,这是什么?)

你可以很容易地做到这一点:

cat filename | sed 1d > filename_without_first_line

在命令行上;或者要永久删除文件的第一行,使用sed的in-place模式,并带-i标志:

sed -i 1d <filename>