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
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:
-
tail -r
: reverserer rekkefølgen på linjene i inngangen -
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]))'
head -n -1
fjerner den første OG den siste linjen i.txt
-filen på Ubuntu 14.04.2LTS.head -n -1
sierhead: illegal line count -- -1
head -n -1
GNU coreutils, kanskje MacOS har en eller annen BSD-variant?