Druk de inhoud van het bestand af zonder de eerste en laatste regels

Is er een eenvoudige manier om een bestand te echoën door de eerste en laatste regels over te slaan? Ik was aan het kijken naar piping van head naar tail, maar voor hen lijkt het erop dat ik van meet af aan het totale aantal regels moet weten. Ik keek ook naar split, maar ik zie ook geen manier om het daarmee te doen.

Antwoord

Alleen met sed, zonder leidingen:

sed "1d;$d" file.txt 

OPMERKING

  • 1 bedoel eerst regel
  • d betekenen verwijderen
  • ; is het scheidingsteken voor 2 commandos
  • $ gemiddelde laatste regel

Answer

U hoeft het aantal regels van tevoren niet te weten. tail en head kunnen respectievelijk een afwijking aan het begin of einde van het bestand nemen.

Deze pipe begint om de tweede regel van het bestand (de eerste regel overslaan) en stopt bij de voorlaatste (de laatste regel overslaan). Om meer dan één regel aan het begin of einde over te slaan, past u de getallen dienovereenkomstig aan.

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

als u het andersom doet, werkt het natuurlijk hetzelfde:

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

Reacties

  • Ik don ' t weet waarom, maar head -n -1 verwijdert de eerste EN de laatste regel van mijn .txt -bestand op Ubuntu 14.04.2LTS.
  • Op MacOS head -n -1 zegt head: illegal line count -- -1
  • head -n -1 werkt met GNU coreutils, misschien heeft MacOS een BSD-variant?

Antwoord

Hier is hoe het te doen met awk:

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

Ook een andere manier voor sed:

sed "1d;x" file.txt 

x is geavanceerd sed commando, schakelt de huidige regel met de vorige: stroom gaat in de buffer en vorige s gaat naar het scherm enzovoort, terwijl sed de stroom regel voor regel verwerkt (dit is waarom de eerste regel leeg blijft).

awk oplossing voor elke stap (regel) plaatst de huidige regel in de variabele en begint deze pas af te drukken nadat de tweede regel is gepasseerd. Zo kregen we een shitfed reeks regels op het scherm van de voorlaatste tot de voorlaatste. De laatste regel wordt weggelaten omdat de regel in de variabele staat en alleen bij de volgende stap moet worden afgedrukt, maar alle stappen zijn al op en we zien de regel nooit op het scherm.

Hetzelfde idee in de perl:

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

$. staat voor regelnummer en $_ voor huidige regel.
perl -n is een snelkoppeling voor while(<..>) {..} structuur en -e is voor inline script.

Antwoord

Voor Mac-gebruikers:

Op Mac: head -n -1 werkt niet. Keer in plaats daarvan het bestand om, hak de eerste regel af en keer het terug:

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

Uitleg:

  1. tail -r: keert de volgorde van de regels in de invoer om

  2. tail -n +2: drukt alle l ines vanaf de tweede regel in zijn invoer

Reacties

  • Het zou mislukken met head: illegal line count -- -1 om precies te zijn.

Antwoord

In Python zou ik dit graag doen.

#!/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])) 

Plak de bovenstaande code in een bestand en noem het script.py. Voer het script uit voor het bestand waarmee u wilt controleren.

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

Voorbeeld:

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

Reacties

  • ''.join(list(open("/path/to/file"))[1:-1]): Dit lijkt een eenvoudigere oplossing te zijn 🙂 En als het nodig is om dit rechtstreeks op de opdrachtprompt te doen, dan zou je kunnen proberen: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *