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ć.

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ę

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

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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.