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
sagthead: 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:
-
tail -r
: Kehrt die Reihenfolge der Zeilen in der Eingabe um. -
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]))'