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

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

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


当前回答

如果您要做的是在失败后恢复,那么您可以构建一个包含迄今为止所做的工作的文件。

if [[ -f $tmpf ]] ; then
    rm -f $tmpf
fi
cat $srcf |
    while read line ; do
        # process line
        echo "$line" >> $tmpf
    done

其他回答

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

cat filename | sed 1d > filename_without_first_line

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

sed -i 1d <filename>

这一行代码可以做到:

echo "$(tail -n +2 "$FILE")" > "$FILE"

它可以工作,因为tail在echo之前执行,然后文件被解锁,因此不需要临时文件。

如果您要做的是在失败后恢复,那么您可以构建一个包含迄今为止所做的工作的文件。

if [[ -f $tmpf ]] ; then
    rm -f $tmpf
fi
cat $srcf |
    while read line ; do
        # process line
        echo "$line" >> $tmpf
    done

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

sed -i '1d' filename

你可以编辑文件:使用perl的-i标志,像这样:

perl -ni -e 'print unless $. == 1' filename.txt

这将使第一行消失。Perl将需要读取和复制整个文件,但是它会将输出保存在原始文件的名称下。