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
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:
-
tail -r
: vender rækkefølgen af linjer i dens input -
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]))'
head -n -1
fjerner den første OG den sidste linje i min.txt
-fil på Ubuntu 14.04.2LTS.head -n -1
sigerhead: illegal line count -- -1
head -n -1
fungerer med GNU coreutils, måske har MacOS en eller anden BSD-variant?