Drucken Sie den Dateiinhalt ohne die erste und letzte Zeile


54

Kann ich auf einfache Weise eine Datei als Echo ausgeben und dabei die erste und die letzte Zeile überspringen? Ich war auf der Suche bei Rohrleitungen aus headin tail, aber für diejenigen , scheint es , wie ich die Gesamt Linien von vornherein wissen müsste. Ich habe auch nachgesehen split, aber ich sehe auch keinen Weg, das zu tun.

Antworten:


97

Nur mit sed, ohne Pfeifen:

sed '1d;$d' file.txt

HINWEIS

  • 1meine erste Zeile
  • dmeine löschen
  • ; ist das Trennzeichen für 2 Befehle
  • $meine letzte Zeile

36

Sie müssen die Anzahl der Zeilen nicht im Voraus kennen. tailund headkö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 an der vorletzten Zeile (Überspringen der letzten Zeile). Passen Sie die Zahlen entsprechend an, um mehr als eine Zeile am Anfang oder Ende zu überspringen.

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

Ich weiß nicht warum, head -n -1entferne aber die erste UND die letzte Zeile meiner .txtDatei unter Ubuntu 14.04.2LTS.
Sopalajo de Arrierez

9

So geht's awk:

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

Auch ein anderer Weg für sed:

sed '1d;x' file.txt

xWenn der sedBefehl advanced ausgeführt wird, wird die aktuelle Zeile mit der vorherigen Zeile umgeschaltet: Die aktuelle Zeile wird in den Puffer und die vorherige sedZeile in den Bildschirm verschoben usw., während der Stream zeilenweise verarbeitet wird (daher ist die erste Zeile leer).

awkDie 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. Auf diese Weise haben wir vom vorletzten bis zum vorletzten Mal eine durcheinandergebrachte Folge von Zeilen auf dem Bildschirm. Die letzte Zeile wird weggelassen, da sich die Zeile in der Variablen befindet und nur im nächsten Schritt gedruckt werden sollte, aber alle Schritte bereits ausgeführt werden und die Zeile nie auf dem Bildschirm angezeigt wird.

Gleiche Idee in der perl:

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

$.steht für Zeilennummer und $_ für aktuelle Zeile.
perl -nist eine Abkürzung für while(<..>) {..}Struktur und -eist für Inline-Skript.


2

In Python würde ich das gerne tun.

#!/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 benennen Sie sie als 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

Für Mac-Benutzer:

Funktioniert auf dem Mac head -n -1nicht. Kehren Sie stattdessen die Datei um, schneiden Sie die erste Zeile ab und kehren Sie sie dann zurück:

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 Zeilen ab der zweiten Zeile in der Eingabe

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.