Chcę wydrukować wiersze z pliku wstecz bez użycia tac
polecenia. Czy jest jakieś inne rozwiązanie tego typu w bash?
shell
text-processing
jimmij
źródło
źródło
Odpowiedzi:
Używanie
sed
do emulacjitac
:źródło
sed
jednowarstwowy. Zobacz „36. Odwróć kolejność wierszy (emuluj polecenie„ tac ”Unix).” w Famous Sed One-Liners wyjaśnił pełne wyjaśnienie tego, jak to działa.sort
- istnieje szansa, że użyje pliku tymczasowego).Z
ed
:Jeśli jesteś na
BSD
/OSX
(i miejmy nadzieję, że wkrótce naGNU
/linux
zbyt jak to będzie POSIX ):źródło
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
przez awk one liner
źródło
awk 'a=$0RS a{}END{printf a}'
but your first
perl reverse <> `to najlepsza / najszybsza odpowiedź na stronie (dla mnie), 10 razy szybsza niż taawk
odpowiedź (wszystkie ankresy awk są mniej więcej takie same, jeśli chodzi o czas)awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
Gdy poprosiłeś o zrobienie tego w bashu, oto rozwiązanie, które nie korzysta z awk, sed ani perla, tylko funkcję bash:
Dane wyjściowe
jest
Zgodnie z oczekiwaniami.
Ale uwaga: wiersze są przechowywane w pamięci, po jednym wierszu w każdej rekurencyjnie nazywanej instancji funkcji. Ostrożnie z dużymi plikami.
źródło
Możesz przepuścić przez:
Te
awk
prefiksy każda linia z numerem linii a następnie po spacji.sort
Odwraca się kolejność linii sortując na pierwszym polu (numer linii) w odwrotnej kolejności, stylu numerycznej. Ised
usuwa numery linii.Poniższy przykład pokazuje to w działaniu:
Wyprowadza:
źródło
cat -n
zachowuje się bardzo podobnieawk '{print NR" "$0}'
W perlu:
źródło
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
)reverse<)
jest szybki: dobrze! ale „naprawdę brzydka” jest bardzo wolna, gdy liczba linii rośnie. !! ....-n
było zbyteczne, dzięki.sort
).Rozwiązanie tylko dla BASH
wczytaj plik do tablicy bash (jedna linia = jeden element tablicy) i wydrukuj tablicę w odwrotnej kolejności:
źródło
while..read
.IFS=''
i,read -r
aby zapobiec wszelkim ucieczkom i końcowemu usuwaniu IFS przed zepsuciem go. Myślę, żemapfile ARRAY_NAME
wbudowane bash jest lepszym rozwiązaniem do wczytywania tablic.Bash, z
mapfile
wymienionymi w komentarzach do fiximan, a właściwie być może lepszą wersją:Jego wydajność jest zasadniczo porównywalna z
sed
rozwiązaniem i rośnie szybciej wraz ze spadkiem liczby żądanych linii.źródło
źródło
jak pokazano tutaj:
Wynik:
źródło
źródło