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
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:
-
tail -r
: odwraca kolejność wierszy na wejściu -
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]))'
head -n -1
usuwa pierwszą ORAZ ostatnią linię mojego pliku.txt
w systemie Ubuntu 14.04.2LTS.head -n -1
mówi, żehead: illegal line count -- -1
head -n -1
działa z GNU coreutils, może MacOS ma jakiś wariant BSD?