Imprimați conținutul fișierului fără prima și ultima linie

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

  • Nu ' t știu de ce, dar head -n -1 elimină prima ȘI ultima linie a fișierului meu .txt, pe Ubuntu 14.04.2LTS.
  • Pe MacOS head -n -1 spune head: illegal line count -- -1
  • head -n -1 funcționează cu GNU coreutils, poate MacOS are o variantă BSD?

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:

  1. tail -r: inversează ordinea liniilor din intrarea sa

  2. 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]))'

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *