Skriv ut filinnehåll utan de första och sista raderna

Finns det ett enkelt sätt att jag kan echo en fil, hoppa över de första och sista raderna? Jag tittade på rör från head till tail, men för dem verkar det som om jag måste veta de totala raderna från början. Jag tittade också på split, men jag ser inte heller ett sätt att göra det med.

Svar

Bara med sed, utan några rör:

sed "1d;$d" file.txt 

OBS

  • 1 betyder först rad
  • d betyder radera
  • ; är separator för två kommandon
  • $ betyder sista raden

Svar

Du behöver inte veta antalet rader i förväg. tail och head kan göra en förskjutning från början respektive slutet av filen.

Detta rör börjar vid den andra raden i filen (hoppar över den första raden) och stannar vid den sista men en (hoppar över den sista raden). För att hoppa över mer än en rad i början eller slutet, justera siffrorna i enlighet med detta.

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

gör det tvärtom, fungerar naturligtvis på samma sätt:

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

Kommentarer

  • Jag don ' t vet varför, men head -n -1 tar bort den första OCH den sista raden i min .txt -fil på Ubuntu 14.04.2LTS.
  • På MacOS head -n -1 säger head: illegal line count -- -1
  • head -n -1 fungerar med GNU coreutils, kanske MacOS har någon BSD-variant?

Svar

Så här gör du det med awk:

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

Också ett annat sätt för sed:

sed "1d;x" file.txt 

x är avancerat sed kommandot, det växlar nuvarande linje med föregående: ström går in i bufferten och föregående s går till skärmen och så vidare medan sed bearbetar strömmen rad för rad (det är därför den första raden blir tom).

awk -lösning på varje steg (rad) sätter den aktuella raden i variabeln och börjar skriva ut den först efter att den andra raden har passerat. Således fick vi en skitmatad sekvens av rader på skärmen från den andra till den sista men en. Den sista raden utelämnas eftersom raden är i variabeln och ska skrivas ut endast i nästa steg, men alla steg har redan slut och vi ser aldrig raden på skärmen.

Samma idé i perl:

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

$. står för radnummer och $_ för aktuell rad.
perl -n är genväg för while(<..>) {..} struktur och -e är för integrerat skript.

Svar

För Mac-användare:

På Mac, head -n -1 fungerar inte. Vänd istället filen, hugga av den första raden och vänd den sedan tillbaka:

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

Förklaring:

  1. tail -r: vänder ordningen på raderna i ingången

  2. tail -n +2: skriver ut alla l ines från den andra raden i dess ingång

Kommentarer

  • Det skulle misslyckas med head: illegal line count -- -1 för att vara exakt.

Svar

I python skulle jag vilja göra det här.

#!/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])) 

Klistra in koden ovan i en fil och namnge den som script.py. Kör skriptet mot filen du vill kontrollera med.

python3 script.py /path/to/the/file 

Exempel:

$ cat file foo apple banana bar $ python3 script.py file apple banana 

Kommentarer

  • ''.join(list(open("/path/to/file"))[1:-1]): Detta verkar vara en enklare lösning 🙂 Och om du behöver göra det direkt på kommandotolken kan du försöka: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *