Chciałbym odwrócić kolejność linii w pliku tekstowym (lub standardowym), zachowując zawartość każdej linii.
Tak więc, zaczynając od:
foo
bar
baz
Chciałbym z tym skończyć
baz
bar
foo
Czy jest do tego standardowe narzędzie wiersza polecenia UNIX?
shell
unix
command-line
Scotty Allen
źródło
źródło
perl -e 'print reverse <>'
ale prawdopodobnie dotyczy to również innych metod).Odpowiedzi:
Ogon BSD:
Odniesienia: strony podręcznika FreeBSD , NetBSD , OpenBSD i OS X.
źródło
Warto również wspomnieć:
tac
(ahem, rewerscat
). Część coreutils .Przerzucanie jednego pliku do drugiego
źródło
brew install coreutils
(instalujegtac
się domyślnie).echo -n "abc\ndee" > test; tac test
.Istnieją dobrze znane sztuczki sed :
(Objaśnienie: poprzedza nieinicjalną linię, aby zatrzymać bufor, zamienić linię i bufor wstrzymania, wydrukować linię na końcu)
Alternatywnie (z szybszym wykonaniem) z jednowarstwowych awk :
Jeśli tego nie pamiętasz,
W systemie z narzędziami GNU pozostałe odpowiedzi są prostsze, ale nie cały świat to GNU / Linux ...
źródło
tail -r
i tac.tac
oczekuje się, że obsłuży dowolne duże pliki, które nie mieszczą się w pamięci (długość linii jest wciąż ograniczona). Nie jest jasne, czysed
rozwiązanie działa dla takich plików.na końcu polecenia umieść:
| tac
tac robi dokładnie to, o co prosisz, „zapisuje każdy PLIK na standardowe wyjście, najpierw w ostatniej linii”.
tac jest przeciwieństwem cat :-).
źródło
tac
polecenia, jest to przydatne dla nowych użytkowników, którzy mogą skończyć z wyszukiwaniem tego samego tematu.Jeśli zdarzy ci się być w
vim
użyciuźródło
przykład:
źródło
Spróbuj
tac
, który działa na Linuksie, a jeśli to nie działa użyjtail -r
, który działa na BSD i OSX.źródło
tac myfile.txt
- czego mi brakuje?tail -r
w przypadku, gdytac
nie jest dostępny.tac
nie jest zgodny z POSIX. Ani też nietail -r
. Nadal nie jest niezawodny, ale poprawia to szanse działania.tac
jest dostępne, ale zabraknie pamięci RAM i zostanie zamienione w połowie korzystania z gigantycznego strumienia wejściowego. Nie udaje się, a następnietail -r
udaje się przetworzyć pozostałą część strumienia, dając niepoprawny wynik.brew install coreutils
i użyjgtac
zamiasttac
i jeśli wolisz, dodaj tac jako alias,gtac
jeśli na przykład chcesz skrypt powłoki, który używał go na różnych platformach (Linux, OSX)Spróbuj wykonać następujące polecenie:
źródło
sed 's/^[0-9]*://g'
nl
domyślnie nie będzie numerować pustych linii. Ta-ba
opcja jest dostępna w niektórych systemach, nie jest uniwersalna (HP / UX przychodzi na myśl, choć wolałbym, żeby nie była), podczas gdygrep -n
zawsze będzie numerować każdą linię pasującą do (w tym przypadku pustego) wyrażenia regularnego.cut -d: -f2-
Just Bash :) (4.0+)
źródło
-nenenenenenene
i zobacz, dlaczego ludzie zalecają zawsze używaćprintf '%s\n'
zamiastecho
.Najprostszą metodą jest użycie
tac
polecenia.tac
jestcat
odwrotna. Przykład:źródło
Naprawdę podoba mi się odpowiedź „ tail -r ”, ale moja ulubiona odpowiedź gawk to…
źródło
mawk
na Ubuntu 14.04 LTS - działa, więc nie jest specyficzne dla GNU awk. +1n++
można zastąpićNR
EDYCJA następujące generuje losowo posortowaną listę liczb od 1 do 10:
gdzie kropki są zastępowane rzeczywistym poleceniem, które odwraca listę
tac
python: używając [:: - 1] na sys.stdin
źródło
Dla różnych systemów operacyjnych (tj. OSX, Linux), które mogą być użyte
tac
w skrypcie powłoki, użyj homebrew, jak inni wspominali powyżej, a następnie alias tac:Zainstaluj lib
W systemie MacOS
Dla systemu Linux Debian
Następnie dodaj alias
źródło
Będzie to działać zarówno na BSD, jak i GNU.
źródło
Jeśli chcesz zmodyfikować plik na swoim miejscu, możesz uruchomić
Eliminuje to potrzebę utworzenia pliku tymczasowego, a następnie usunięcia lub zmiany nazwy oryginału i daje ten sam rezultat. Na przykład:
Na podstawie odpowiedzi udzielonej przez ephemient , która zrobiła prawie, ale nie całkiem, to, czego chciałem.
źródło
Zdarza mi się, że chcę sprawnie uzyskać ostatnie
n
wiersze bardzo dużego pliku tekstowego .Pierwszą rzeczą, której próbowałem
tail -n 10000000 file.txt > ans.txt
, było bardzo wolne, ponieważ muszętail
szukać lokalizacji, a następnie wraca, aby wydrukować wyniki.Kiedy zdaje sobie sprawy, mogę przełączyć na inne rozwiązanie:
tac file.txt | head -n 10000000 > ans.txt
. Tym razem pozycja poszukiwania musi tylko przejść od końca do pożądanej lokalizacji i oszczędza 50% czasu !Wiadomość do domu:
Użyj,
tac file.txt | head -n n
jeślitail
nie masz takiej-r
opcji.źródło
Najlepsze rozwiązanie:
źródło
Dla użytkowników Emacsa:
C-x h
(wybierz cały plik), a następnieM-x reverse-region
. Działa również do zaznaczania części lub linii i przywracania ich.źródło
Widzę wiele interesujących pomysłów. Ale wypróbuj mój pomysł. Dodaj do tego swój tekst:
który zakłada, że znaku „~” nie ma w pliku. Powinno to działać na każdej powłoce UNIX od 1961 roku. Lub coś w tym rodzaju.
źródło
Miałem to samo pytanie, ale chciałem też, aby pierwsza linia (nagłówek) pozostała na górze. Musiałem więc użyć mocy awk
PS działa również w cygwin lub gitbash
źródło
1\n20\n19...2\n
raczej do niż20\n19...\2\n1\n
.Możesz to zrobić za pomocą
vim
stdin
istdout
. Możesz także użyć,ex
aby zachować zgodność z POSIX .vim
jest tylko trybem wizualnymex
. W rzeczywistości możesz używaćex
zvim -e
lubvim -E
(ex
tryb ulepszony ).vim
jest przydatny, ponieważ w przeciwieństwie do takich narzędzised
buforuje plik do edycji, podczas gdysed
jest używany do strumieni. Możesz być w stanie użyćawk
, ale musisz ręcznie buforować wszystko w zmiennej.Chodzi o to, aby wykonać następujące czynności:
g/^/m0
. Oznacza to globalnie, dla każdej liniig
; dopasuj początek linii, który pasuje do wszystkiego^
; przenieś go po adresie 0, czyli linii 1m0
.%p
. Oznacza to zakres wszystkich linii%
; wydrukuj linięp
.q!
. To oznacza wyjścieq
; zdecydowanie!
.Jak uczynić to wielokrotnego użytku
Używam skryptu, który
ved
wywołuję (jak edytor vimsed
), aby używać vima do edycjistdin
. Dodaj to do pliku o nazwieved
na swojej ścieżce:Używam jednego
+
polecenia zamiast+'%p' +'q!'
, ponieważ vim ogranicza cię do 10 poleceń. Tak więc ich połączenie pozwala"$@"
mieć 9+
poleceń zamiast 8.Następnie możesz zrobić:
Jeśli nie masz vima 8, wstaw to w
ved
zamian:źródło
lub
lub
źródło
ogon -r działa w większości systemów Linux i MacOS
seq 1 20 | ogon -r
źródło
lub
źródło
sort -r
działa tylko wtedy, gdy dane wejściowe są już posortowane, co nie ma miejsca w tym przypadku.rev
odwraca znaki w wierszu, ale zachowuje nienaruszoną kolejność wierszy, co również nie jest tym, o co poprosił Scotty. Tak więc ta odpowiedź nie jest wcale odpowiedzią.