Czy istnieje sposób na head
/ tail
dokument i uzyskanie odwrotnego wyniku; bo nie wiesz, ile wierszy jest w dokumencie?
Tzn. Chcę tylko uzyskać wszystko oprócz pierwszych 2 wierszy, foo.txt
aby dołączyć do innego dokumentu.
text-processing
tail
head
chrisjlee
źródło
źródło
\n
” .. Działa dla wszystkich liczb całkowitych ujemnych innych niż te,-n -0
które w ogóle nic nie zwracają , tak jak-n 0
by to robił (używając: head (GNU coreutils) 7.4) ... Jednak gdy występuje trailing\n
,-n -0
drukuje jak można się spodziewać po-
, tj. drukuje cały plik ... Tak to działa dla wszystkich nie-zerowych wartości ujemnych .. ale-0
nie powiedzie się, gdy nie ma spływu\n
head -n -2
nie jest kompatybilny z POSIX .Jeśli chcesz mieć wszystkie oprócz pierwszych linii N-1, zadzwoń
tail
z liczbą linii+N
. (Liczba jest numerem pierwszego wiersza, który chcesz zachować, zaczynając od 1, tzn. +1 oznacza początek na górze, +2 oznacza pominięcie jednej linii i tak dalej).Nie ma łatwego, przenośnego sposobu na pominięcie ostatnich N linii. GNU
head
pozwalahead -n +N
jako odpowiedniktail -n +N
. W przeciwnym razie, jeśli masztac
(np. GNU lub Busybox), możesz połączyć go z tailem:Przenośnie możesz użyć filtra awk (niesprawdzony):
Jeśli chcesz usunąć kilka ostatnich wierszy z dużego pliku, możesz określić przesunięcie bajtu kawałka do obcięcia, a następnie wykonać obcięcie za pomocą
dd
.Na początku nie można obciąć pliku, ale jeśli chcesz usunąć kilka pierwszych wierszy dużego pliku, możesz przenosić zawartość .
źródło
Ze strony podręcznika
tail
(czyli GNUtail
):Dlatego poniższe powinny dołączyć wszystkie oprócz pierwszych 2 wierszy
somefile.txt
doanotherfile.txt
:źródło
Aby usunąć pierwsze n wierszy, można użyć GNU sed. Na przykład, jeśli n = 2
!
Średni „wykluczyć ten przedział”. Jak można sobie wyobrazić, można na przykład uzyskać bardziej skomplikowany wynikpokaże linię 3,4,5,7. Większa moc pochodzi z używania wyrażeń regularnych zamiast adresów.
Ograniczeniem jest to, że numery linii muszą być znane z góry.
źródło
sed 1,2d
? Prostsze jest zwykle lepsze. Również nic w twoich przykładach nie jest specyficzne dla GNU Sed; wszystkie twoje polecenia używają standardowych funkcji POSIX Sed .Możesz użyć
diff
do porównania danych wyjściowychhead
/tail
z oryginalnego pliku, a następnie usunąć to samo, uzyskując odwrotność.źródło
Podczas
tail -n +4
gdy plik wyjściowy rozpoczynający się od czwartej linii (wszystkie oprócz pierwszych 3 linii) jest standardowy i przenośny, jegohead
odpowiednik (head -n -3
wszystkie oprócz ostatnich 3 linii) nie jest.Przenośnie zrobiłbyś:
Lub:
(uwaga, że w niektórych systemach, w których
sed
przestrzeń wzorców ma ograniczony rozmiar, nie skaluje się do dużych wartościn
).Lub:
źródło
Jeśli
<infile
jest to zwykłylseek()
plik, który można obsługiwać, to tak, z całą pewnością, nie krępuj się. Powyższe jest konstrukcją w pełni obsługiwaną przez POSIXly.źródło
Moje podejście jest podobne do Gillesa, ale zamiast tego po prostu odwracam plik poleceniem cat i pipe, używając polecenia head.
tac -r thefile.txt | head thisfile.txt (zastępuje pliki)
źródło
Mam nadzieję, że zrozumiałem twoją potrzebę.
Masz kilka sposobów na zrealizowanie swojego żądania:
Gdzie / etc / passwd to twój plik
Drugie rozwiązanie może być przydatne, jeśli masz duży plik:
źródło
Rozwiązanie dla BSD (macOS):
Usuń pierwsze 2 linie:
Usuń ostatnie 2 linie:
... niezbyt elegancki, ale wykonuje pracę!
źródło