Skriv ut filinnhold uten første og siste linje

Er det en enkel måte jeg kan ekko en fil på, og hoppe over første og siste linje? Jeg så på rør fra head til tail, men for de virker det som om jeg må vite de totale linjene fra begynnelsen. Jeg så også på split, men jeg ser heller ikke en måte å gjøre det på.

Svar

Bare med sed, uten noen rør:

sed "1d;$d" file.txt 

MERK

  • 1 betyr første linje
  • d betyr delete
  • ; er skilletegn for to kommandoer
  • $ betyr siste linje

Svar

Du trenger ikke å vite antall linjer på forhånd. tail og head kan motregnes fra henholdsvis begynnelsen eller slutten av filen.

Dette røret starter kl. den andre linjen i filen (hopper over den første linjen) og stopper ved den siste, men en (hopper over den siste linjen). For å hoppe over mer enn en linje i begynnelsen eller slutten, må du justere tallene tilsvarende.

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

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

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

Kommentarer

  • Jeg don ' t vet hvorfor, men head -n -1 fjerner den første OG den siste linjen i .txt -filen på Ubuntu 14.04.2LTS.
  • På MacOS head -n -1 sier head: illegal line count -- -1
  • head -n -1 GNU coreutils, kanskje MacOS har en eller annen BSD-variant?

Svar

Slik gjør du det med awk:

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

Også en annen måte for sed:

sed "1d;x" file.txt 

x er avansert sed kommandoen, den bytter gjeldende linje med forrige: gjeldende går inn i bufferen og previou s går til skjermen og så videre mens sed behandler strøm linje for linje (dette er grunnen til at den første linjen vil være tom).

awk -løsningen på hvert trinn (linje) setter gjeldende linje i variabelen og begynner å skrive den ut etter at den andre linjen er passert. Dermed fikk vi en drittsekvens av linjer på skjermen fra den andre til den siste, men en. Siste linje er utelatt fordi linjen er i variabelen og skal bare skrives ut på neste trinn, men alle trinnene går allerede ut og vi ser aldri linjen på skjermen.

Samme idé i perl:

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

$. står for linjenummer og $_ for gjeldende linje.
perl -n er snarvei for while(<..>) {..} struktur og -e er for innebygd skript.

Svar

For Mac-brukere:

På Mac, head -n -1 fungerer ikke. I stedet snu filen, hugg av den første linjen, og snu den deretter tilbake:

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

Forklaring:

  1. tail -r: reverserer rekkefølgen på linjene i inngangen

  2. tail -n +2: skriver ut alle l ines starter fra den andre linjen i innspillet

Kommentarer

  • Det ville mislykkes med head: illegal line count -- -1 for å være nøyaktig.

Svar

I python vil jeg gjøre 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])) 

Lim inn koden ovenfor i en fil og navngi den som script.py. Kjør skriptet mot filen du vil sjekke 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 ut til å være en enklere løsning 🙂 Og hvis du trenger at det skal gjøres direkte på ledeteksten, kan du prøve: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *