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?

1356voto

Aaron Digulla Punkte 308693

Versuchen Sie Schwanz :

tail -n +2 "$FILE"

-n x : Drucken Sie einfach die letzte x Zeilen. tail -n 5 würden Sie die letzten 5 Zeilen der Eingabe erhalten. Die + Zeichen kehrt das Argument gewissermaßen um und macht tail alles außer dem ersten drucken x-1 Zeilen. tail -n +1 würde die gesamte Datei drucken, tail -n +2 alles außer der ersten Zeile, usw.

GNU tail ist viel schneller als sed . tail ist auch unter BSD verfügbar und die -n +2 Flagge ist in beiden Werkzeugen gleich. Prüfen Sie die FreeBSD o OS X Man Pages für mehr.

Die BSD-Version kann viel langsamer sein als sed Allerdings. Ich frage mich, wie sie das geschafft haben; tail sollte eine Datei einfach Zeile für Zeile lesen, während sed führt ziemlich komplexe Operationen durch, die das Interpretieren eines Skripts, die Anwendung regulärer Ausdrücke und ähnliches beinhalten.

Hinweis: Sie könnten versucht sein, die

# THIS WILL GIVE YOU AN EMPTY FILE!
tail -n +2 "$FILE" > "$FILE"

aber damit erhalten Sie eine leere Datei . Der Grund dafür ist, dass die Umleitung ( > ) geschieht vor tail wird von der Shell aufgerufen:

  1. Shell schneidet Datei ab $FILE
  2. Shell erstellt einen neuen Prozess für tail
  3. Shell leitet stdout des Programms tail Prozess zu $FILE
  4. tail liest aus dem nun leeren $FILE

Wenn Sie die erste Zeile in der Datei entfernen möchten, sollten Sie die Option:

tail -n +2 "$FILE" > "$FILE.tmp" && mv "$FILE.tmp" "$FILE"

El && stellt sicher, dass die Datei nicht überschrieben wird, wenn ein Problem auftritt.

337voto

amit Punkte 4219

Sie können -i verwenden, um die Datei zu aktualisieren, ohne den Operator '>' zu verwenden. Der folgende Befehl löscht die erste Zeile aus der Datei und speichert sie in der Datei (verwendet ein temporäre Datei hinter den Kulissen).

sed -i '1d' filename

84voto

Nasri Najib Punkte 1211

Für diejenigen, die mit SunOS arbeiten, das nicht GNU ist, wird der folgende Code helfen:

sed '1d' test.dat > tmp.dat

22voto

Ingo Baab Punkte 425

Sie können dies ganz einfach mit tun:

cat filename | sed 1d > filename_without_first_line

auf der Befehlszeile; oder um die erste Zeile einer Datei dauerhaft zu entfernen, verwenden Sie den In-Place-Modus von sed mit der Option -i Flagge:

sed -i 1d <filename>

16voto

agc Punkte 7474

El sponge verwenden vermeidet das Jonglieren mit einer temporären Datei:

tail -n +2 "$FILE" | sponge "$FILE"

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