it-swarm.com.de

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.

59
user394

Nur mit sed, ohne Pipes:

sed '1d;$d' file.txt

NOTE

  • 1 mean erste Zeile
  • d mean delete
  • ; ist das Trennzeichen für 2 Befehle
  • $ mean letzte Zeile
105
Gilles Quenot

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 in der zweiten Zeile der Datei (Überspringen der ersten Zeile) und endet in 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

umgekehrt funktioniert es natürlich genauso:

head -n -1 file.txt | tail -n +2
38
Olaf Dietsche

So geht's mit awk:

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

Auch ein anderer Weg für sed:

sed '1d;x' file.txt

x ist ein erweiterter sed Befehl, der die aktuelle Zeile mit der vorherigen umschaltet: Der Strom geht in den Puffer und der vorherige geht auf den Bildschirm und so weiter, während sed die Stream-Zeile durch verarbeitet Zeile (aus diesem Grund ist die erste Zeile leer).

awk Die Lösung für jeden Schritt (Zeile) fügt die aktuelle Zeile in die Variable ein und beginnt erst mit dem Ausdrucken, 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. Alle Schritte sind jedoch bereits abgelaufen und wir sehen die Zeile nie auf dem Bildschirm.

Gleiche Idee im Perl:

Perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$. Steht für Zeilennummer und $_ Für aktuelle Zeile.
Perl -n Ist eine Verknüpfung für die Struktur while(<..>) {..} und -e Für das Inline-Skript.

9
rook

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 seiner Eingabe um

  2. tail -n +2: Druckt alle Zeilen ab der zweiten Zeile in der Eingabe

2
Sarfraaz Ahmed

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
2
Avinash Raj