Există o modalitate simplă de a face ecou unui fișier, omitând prima și ultima linie? Mă uitam la conducte de la head
la tail
, dar pentru aceștia se pare că ar trebui să știu liniile totale de la început. De asemenea, mă uitam la split
, dar nici nu văd o modalitate de a face asta.
Răspuns
Doar cu sed
, fără conducte:
sed "1d;$d" file.txt
NOTĂ
-
1
înseamnă primul linie -
d
înseamnă șterge -
;
este separatorul pentru 2 comenzi -
$
înseamnă ultima linie
Răspuns
Nu trebuie să știți numărul de linii în avans. tail
și head
pot lua un offset de la începutul sau respectiv sfârșitul fișierului.
Această conductă începe de la a doua linie a fișierului (sărind peste prima linie) și se oprește la ultima, dar una (sărind linia finală). Pentru a sări peste mai multe rânduri la început sau la sfârșit, ajustați numerele în consecință.
tail -n +2 file.txt | head -n -1
dacă faceți invers, funcționează la fel, desigur:
head -n -1 file.txt | tail -n +2
Comentarii
Răspuns
Iată cum să o faci cu awk
:
awk "NR>2 {print t} {t=$0}"
De asemenea, un alt mod pentru sed
:
sed "1d;x" file.txt
x
este comandă avansată sed
, comută linia curentă cu precedentul: curentul intră în buffer și este previou s merge la ecran și așa mai departe în timp ce sed
procesează flux linie cu linie (de aceea prima linie va fi necompletată).
awk
soluție pe fiecare pas (linie) introduce linia curentă în variabilă și începe să o tipărească numai după ce a doua linie este trecută. Astfel, am obținut secvența de linii pe ecran de la a doua la ultima, dar una. Ultima linie este omisă pentru că linia se află în variabilă și ar trebui să fie tipărită doar la pasul următor, dar toți pașii se termină deja și nu vedem niciodată linia pe ecran.
Aceeași idee în perl
:
perl -ne "print $t if $.>2 ; $t=$_" file.txt
$.
reprezintă numărul liniei și $_
pentru linia curentă.
perl -n
este o comandă rapidă pentru while(<..>) {..}
structura și -e
sunt pentru script inline.
Răspuns
Pentru utilizatorii de Mac:
Pe Mac, head -n -1
nu funcționează. În schimb, inversați fișierul, tăiați prima linie, apoi inversați-l înapoi:
tail -r file.txt | tail -n +2 | tail -r
Explicație:
-
tail -r
: inversează ordinea liniilor din intrarea sa -
tail -n +2
: tipărește toate l începe începând de la a doua linie în introducerea sa
Comentarii
- Ar eșua cu
head: illegal line count -- -1
pentru a fi exact.
Răspuns
În Python aș face așa.
#!/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]))
Lipiți codul de mai sus într-un fișier și denumiți-l ca script.py
. Rulați scriptul cu fișierul cu care doriți să verificați.
python3 script.py /path/to/the/file
Exemplu:
$ cat file foo apple banana bar $ python3 script.py file apple banana
Comentarii
-
''.join(list(open("/path/to/file"))[1:-1])
: Aceasta pare a fi o soluție mai simplă 🙂 Și dacă aveți nevoie să se facă direct pe promptul de comandă, atunci puteți încerca:python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'
head -n -1
elimină prima ȘI ultima linie a fișierului meu.txt
, pe Ubuntu 14.04.2LTS.head -n -1
spunehead: illegal line count -- -1
head -n -1
funcționează cu GNU coreutils, poate MacOS are o variantă BSD?