Udskriv filindhold uden de første og sidste linjer

Er der en enkel måde, jeg kan ekko en fil på, springe over den første og sidste linje? Jeg kiggede på rør fra head til tail, men for dem ser det ud til at jeg bliver nødt til at kende de samlede linjer fra starten. Jeg kiggede også på split, men jeg kan heller ikke se en måde at gøre det på.

Svar

Bare med sed uden nogen rør:

sed "1d;$d" file.txt 

BEMÆRK

  • 1 betyder første linje
  • d betyder delete
  • ; er separatoren for 2 kommandoer
  • $ betyder sidste linje

Svar

Du behøver ikke at kende antallet af linjer på forhånd. tail og head kan tage en forskydning fra henholdsvis begyndelsen eller slutningen af filen.

Dette rør starter ved den anden linje i filen (springer over den første linje) og stopper ved den sidste, men en (springer over den sidste linje). For at springe over mere end en linje i begyndelsen eller slutningen skal du justere tallene i overensstemmelse hermed.

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

gør det omvendt, fungerer selvfølgelig det samme:

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

Kommentarer

  • Jeg don ' t ved hvorfor, men head -n -1 fjerner den første OG den sidste linje i min .txt -fil på Ubuntu 14.04.2LTS.
  • På MacOS head -n -1 siger head: illegal line count -- -1
  • head -n -1 fungerer med GNU coreutils, måske har MacOS en eller anden BSD-variant?

Svar

Sådan gør du det med awk:

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

Også en anden måde for sed:

sed "1d;x" file.txt 

x er avanceret sed kommandoen, den skifter den aktuelle linje med kommandoen forrige: strøm går ind i bufferen og previou s går til skærmen og så videre, mens sed behandler strøm linje for linje (det er derfor, den første linje vil være tom).

awk -løsning på hvert trin (linje) placerer den aktuelle linje i variablen og begynder kun at udskrive den, når den anden linje er passeret. Således fik vi en shitfed sekvens af linjer på skærmen fra den anden til den sidste, men en. Sidste linje er udeladt, fordi linjen er i variablen og skal kun udskrives på det næste trin, men alle trin er allerede løbet tør, og vi ser aldrig linjen på skærmen.

Samme idé i perl:

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

$. står for linjenummer og $_ for den aktuelle linje.
perl -n er genvej til while(<..>) {..} struktur og -e er til indbygget script.

Svar

For Mac-brugere:

På Mac, head -n -1 fungerer ikke. I stedet skal du vende filen, hugge den første linje af og derefter vende den tilbage:

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

Forklaring:

  1. tail -r: vender rækkefølgen af linjer i dens input

  2. tail -n +2: udskriver alle l ines startende fra anden linje i dens input

Kommentarer

  • Det mislykkedes med head: illegal line count -- -1 for at være præcis.

Svar

I python vil jeg gerne have dette.

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

Indsæt ovenstående kode i en fil, og navngiv den som script.py. Kør scriptet mod den fil, du vil kontrollere med.

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

Eksempel:

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

Kommentarer

  • ''.join(list(open("/path/to/file"))[1:-1]): Dette ser ud til at være en enklere løsning 🙂 Og hvis du har brug for det, skal det gøres direkte ved kommandoprompten, så kan du prøve: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *