Wydrukuj zawartość pliku bez pierwszej i ostatniej linii

54

Czy istnieje prosty sposób na echo pliku, pomijając pierwszą i ostatnią linię? Szukałem w rurociągu od headdo tail, ale dla tych, wydaje się, że muszę znać wszystkich linii od samego początku. Patrzyłem również split, ale nie widzę też sposobu, aby to zrobić.

użytkownik394
źródło

Odpowiedzi:

97

Tylko z sed, bez żadnych rur:

sed '1d;$d' file.txt

UWAGA

  • 1oznacza pierwszą linię
  • doznacza usuń
  • ; jest separatorem dla 2 poleceń
  • $oznacza ostatnią linię
Gilles Quenot
źródło
36

Nie musisz z góry znać liczby linii. taili headmoże przyjąć przesunięcie odpowiednio od początku lub końca pliku.

Ten potok zaczyna się od drugiego wiersza pliku (pomijając pierwszy wiersz), a kończy na przedostatnim (pomijając ostatni wiersz). Aby pominąć więcej niż jedną linię na początku lub na końcu, odpowiednio dostosuj liczby.

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

robienie tego na odwrót, działa oczywiście tak samo:

head -n -1 file.txt | tail -n +2
Olaf Dietsche
źródło
Nie wiem dlaczego, ale head -n -1usuwa pierwszy ORAZ ostatni wiersz mojego .txtpliku na Ubuntu 14.04.2LTS.
Sopalajo de Arrierez
9

Oto jak to zrobić za pomocą awk:

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

Również inny sposób na sed:

sed '1d;x' file.txt

xjest sedpoleceniem zaawansowanym , przełącza bieżącą linię na poprzednią: prąd przechodzi do bufora, a poprzedni przechodzi na ekran itd. podczas sedprzetwarzania strumienia linia po linii (dlatego pierwsza linia będzie pusta).

awkrozwiązanie na każdym kroku (linii) umieszcza bieżącą linię w zmiennej i zaczyna ją drukować dopiero po przejściu drugiej linii. Tak więc na ekranie pojawiła się sfałszowana sekwencja linii od drugiej do ostatniej. Ostatni wiersz jest pomijany, ponieważ wiersz znajduje się w zmiennej i powinien zostać wydrukowany tylko w następnym kroku, ale wszystkie kroki już się kończą i nigdy nie widzimy linii na ekranie.

Ten sam pomysł w perl:

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

$.oznacza numer linii i $_ bieżącą linię.
perl -nto skrót do while(<..>) {..}struktury i -edo wbudowanego skryptu.

wieża
źródło
2

W Pythonie zrobiłbym tak.

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

Wklej powyższy kod do pliku i nazwij go jako script.py. Uruchom skrypt dla pliku, który chcesz sprawdzić.

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

Przykład:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana
Avinash Raj
źródło
2

Użytkownicy komputerów Mac:

Na komputerze Mac head -n -1nie działa. Zamiast tego odwróć plik, odetnij pierwszy wiersz, a następnie cofnij:

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

Wyjaśnienie:

  1. tail -r : odwraca kolejność linii na wejściu

  2. tail -n +2 : drukuje wszystkie linie zaczynające się od drugiej linii na wejściu

Sarfraaz Ahmed
źródło