767 Stimmen

Wie kann ich die erste Zeile einer Textdatei mit einem bash/sed-Skript entfernen?

Ich muss wiederholt die erste Zeile aus einer großen Textdatei mit Hilfe eines Bash-Skripts entfernen.

Zurzeit verwende ich sed -i -e "1d" $FILE - aber es dauert etwa eine Minute, bis die Löschung erfolgt.

Gibt es eine effizientere Möglichkeit, dies zu erreichen?

6voto

Hongbo Liu Punkte 2446

Sie könnten dafür vim verwenden:

vim -u NONE +'1d' +'wq!' /tmp/test.txt

Dies sollte schneller sein, da vim beim Verarbeiten nicht die ganze Datei liest.

5voto

Wie wäre es mit der Verwendung von csplit?

man csplit
csplit -k file 1 '{1}'

4voto

egors Punkte 41

Diese eine Zeile wird genügen:

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

Es funktioniert, da tail ausgeführt wird, bevor echo und dann wird die Datei entsperrt, so dass keine temporäre Datei erforderlich ist.

1voto

Brent Punkte 15119

Da ich das Löschen wohl nicht beschleunigen kann, wäre es vielleicht sinnvoll, die Datei in Stapeln zu verarbeiten, etwa so:

While file1 not empty
  file2 = head -n1000 file1
  process file2
  sed -i -e "1000d" file1
end

Der Nachteil ist, dass, wenn das Programm in der Mitte abgebrochen wird (oder wenn es einige schlechte sql in dort - was die "Prozess"-Teil zu sterben oder blockiert), wird es Zeilen, die entweder übersprungen werden, oder zweimal verarbeitet.

(file1 enthält Zeilen mit SQL-Code)

0voto

Tim Punkte 17

Wenn Sie nach einem Fehlschlag wiederhergestellt werden sollen, können Sie einfach eine Datei erstellen, die Ihre bisherigen Schritte enthält.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X