Drucken Sie den Dateiinhalt ohne die erste und letzte Zeile.

Gibt es eine einfache Möglichkeit, eine Datei zu wiederholen und die erste und letzte Zeile zu überspringen? Ich habe mir Piping von head nach tail angesehen, aber für diese scheint es, als müsste ich die Gesamtzahl der Zeilen von Anfang an kennen. Ich habe mir auch split angesehen, aber ich sehe auch keinen Weg, dies zu tun.

Antwort

Nur mit sed ohne Pipes:

sed "1d;$d" file.txt 

HINWEIS

  • 1 bedeutet zuerst Zeile
  • d bedeutet löschen
  • ; ist das Trennzeichen für 2 Befehle
  • $ bedeutet letzte Zeile

Antwort

Sie müssen die Anzahl der Zeilen nicht im Voraus kennen. tail und head können einen Versatz vom Anfang bzw. Ende der Datei nehmen.

Diese Pipe beginnt bei die zweite Zeile der Datei (Überspringen der ersten Zeile) und stoppt bei der vorletzten Zeile (Überspringen der letzten Zeile). Um mehr als eine Zeile am Anfang oder Ende zu überspringen, passen Sie die Zahlen entsprechend an.

tail -n +2 file.txt | head -n -1 

Wenn Sie es umgekehrt machen, funktioniert das natürlich genauso:

head -n -1 file.txt | tail -n +2 

Kommentare

  • Ich habe nicht ' t weiß warum, aber head -n -1 entfernt die erste UND die letzte Zeile meiner .txt -Datei unter Ubuntu 14.04.2LTS.
  • Unter MacOS head -n -1 sagt head: illegal line count -- -1
  • head -n -1 funktioniert mit GNU-Coreutils, vielleicht hat MacOS eine BSD-Variante?

Antwort

So gehts mit awk:

awk "NR>2 {print t} {t=$0}" 

Auch eine andere Möglichkeit für sed:

sed "1d;x" file.txt 

x ist fortgeschritten sed Befehl, wechselt die aktuelle Leitung mit dem vorherige: Strom fließt in den Puffer und vorher s geht zum Bildschirm und so weiter, während sed Stream zeilenweise verarbeitet (aus diesem Grund ist die erste Zeile leer).

-Lösung für jeden Schritt (Zeile) fügt die aktuelle Zeile in die Variable ein und druckt sie erst aus, nachdem die zweite Zeile übergeben wurde. So haben wir eine beschissene Folge von Zeilen auf dem Bildschirm von der vorletzten bis zur vorletzten. Die letzte Zeile wird weggelassen, da sich die Zeile in der Variablen befindet und erst beim nächsten Schritt gedruckt werden sollte, aber alle Schritte bereits ausgeführt werden und die Zeile auf dem Bildschirm nie angezeigt wird.

Dieselbe Idee im perl:

 perl -ne "print $t if $.>2 ; $t=$_" file.txt  

$. steht für Zeilennummer und $_ für die aktuelle Zeile.
perl -n ist eine Verknüpfung für while(<..>) {..} Struktur und -e ist für Inline-Skript.

Antwort

Für Mac-Benutzer:

Auf dem Mac head -n -1 funktioniert nicht. Kehren Sie stattdessen die Datei um, hacken Sie die erste Zeile ab und kehren Sie sie dann um:

tail -r file.txt | tail -n +2 | tail -r 

Erläuterung:

  1. tail -r: Kehrt die Reihenfolge der Zeilen in der Eingabe um.

  2. tail -n +2: druckt alle l ines beginnend mit der zweiten Zeile in der Eingabe

Kommentare

  • Mit um genau zu sein.

Antwort

In Python würde mir das gefallen.

#!/usr/bin/python3 import re import sys file = sys.argv[1] with open(file, "r") as f: L = [] for line in f: line = re.sub(r"\n", r"", line) L.append(line) print("\n".join(L[1:-1])) 

Fügen Sie den obigen Code in eine Datei ein und nennen Sie ihn script.py. Führen Sie das Skript für die Datei aus, mit der Sie prüfen möchten.

python3 script.py /path/to/the/file 

Beispiel:

$ cat file foo apple banana bar $ python3 script.py file apple banana 

Kommentare

  • ''.join(list(open("/path/to/file"))[1:-1]): Dies scheint eine einfachere Lösung zu sein 🙂 Und wenn Sie dies direkt an der Eingabeaufforderung tun müssen, können Sie Folgendes versuchen: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Deep Theme Powered by WordPress