Wydrukuj zawartość pliku bez pierwszej i ostatniej linii

Czy istnieje prosty sposób na powtórzenie pliku z pominięciem pierwszej i ostatniej linii? Patrzyłem na rurociągi z head do tail, ale dla nich wydaje się, że musiałbym znać całkowitą liczbę linii od samego początku. Patrzyłem również na split, ale też nie widzę sposobu, aby to zrobić.

Odpowiedź

Tylko z sed, bez potoków:

sed "1d;$d" file.txt 

UWAGA

  • 1 znaczy pierwsza linia
  • d średnia delete
  • ; jest separatorem dla 2 poleceń
  • $ oznacza ostatnia linia

Odpowiedź

Nie musisz z góry znać liczby wierszy. tail i head mogą przyjąć przesunięcie odpowiednio od początku lub końca pliku.

Ten potok zaczyna się od drugiej linii pliku (pomijając pierwszą linię) i zatrzymuje się na przedostatniej (pomijając ostatnią linię). 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 

robiąc to w drugą stronę, oczywiście działa tak samo:

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

Komentarze

  • Nie ' t wiem dlaczego, ale head -n -1 usuwa pierwszą ORAZ ostatnią linię mojego pliku .txt w systemie Ubuntu 14.04.2LTS.
  • W systemie MacOS head -n -1 mówi, że head: illegal line count -- -1
  • head -n -1 działa z GNU coreutils, może MacOS ma jakiś wariant BSD?

Odpowiedź

Oto jak to zrobić z awk:

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

Również inny sposób na sed:

sed "1d;x" file.txt 

x jest zaawansowanym poleceniem sed, przełącza bieżącą linię za pomocą poprzedni: prąd idzie do bufora i poprzedni s przechodzi do ekranu i tak dalej, podczas gdy sed przetwarza strumień linia po linii (dlatego pierwsza linia będzie pusta).

awk rozwiązanie w każdym kroku (linii) umieszcza bieżącą linię w zmiennej i rozpoczyna jej drukowanie dopiero po przejściu drugiej linii. W ten sposób na ekranie pojawiła się gówniana sekwencja linii od przedostatniej do przedostatniej. Ostatnia linia jest pomijana, ponieważ linia znajduje się w zmiennej i powinna zostać wydrukowana dopiero w następnym kroku, ale wszystkie kroki już się skończyły i nigdy nie widzimy linii na ekranie.

Ten sam pomysł w perl:

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

$. oznacza numer linii, a $_ bieżącą linię.
perl -n to skrót do while(<..>) {..} struktura i -e jest dla skryptu wbudowanego.

Odpowiedź

Użytkownicy komputerów Mac:

Na Macu head -n -1 nie działa. Zamiast tego odwróć plik, odetnij pierwszą linię, a następnie odwróć ją z powrotem:

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

Wyjaśnienie:

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

  2. tail -n +2: wyświetla cały plik l iny zaczynające się od drugiej linii w swoim wejściu

Komentarze

  • Nie powiedzie się z head: illegal line count -- -1 dokładnie.

Odpowiedź

W Pythonie chciałbym to zrobić.

#!/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 nadaj mu nazwę 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 

Komentarze

  • ''.join(list(open("/path/to/file"))[1:-1]): Wydaje się, że jest to prostsze rozwiązanie 🙂 A jeśli chcesz to zrobić bezpośrednio w wierszu poleceń, możesz spróbować: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *