Forum Linux.pl

Programowanie => Bash, skrypty powłoki => Wątek zaczęty przez: guest013 w 2021-10-25, 13:32:16

Tytuł: wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby
Wiadomość wysłana przez: guest013 w 2021-10-25, 13:32:16
Witam,
chciałbym prosić o podpowiedź odnośnie tematu tego wątku.
Ogólnie rzecz biorąc wiem jak to wykonać:
tail -2 file.txt | head -1
Jednak próbuję poznać inne sposoby rozwiązania tego problemu. I nie jest to problem w pracy czy na studiach. Ja bawię się bashem hobbystycznie w domu :)

Wyczytałem że można użyć sed, ale nie wyświetla mi przedostatniej, a dwie ostatnie linijki. To tylko moja próba, i do końca nie rozumiem co i jak się tu dzieje, ponieważ sądziłem że sed służy głównie do znalezienia jakiegoś paternu i podmiany na inny (s/from/to).
sed '$!N;$!D' file.txt

Próbowałem także użyć awk ale w tym przypadku nie mam kompletnie czym się pochwalić.

Czy mógłbym liczyć jeśli nawet nie na konkretną odpowiedź to chociaż wskazanie kierunku poszukiwań?
Tytuł: Odp: wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby
Wiadomość wysłana przez: guest013 w 2021-10-25, 20:45:52
Zawsze pisząc zapytanie na forach i tak kombinuję, jak samodzielnie rozwiązać swój problem.
Tak też i w tym przypadku, udało mi się poradzić sobie z sedem.
To co potrzebowałem wywołuje poniższe:
sed -n 'x;$p' file.txt

Ale z awk będzie trudniej, i liczę na pomoc ;)
Tytuł: Odp: wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby
Wiadomość wysłana przez: guest013 w 2021-10-25, 23:56:25
Idę niczym burza :) i gadam sam do siebie.
Zamieszczam odpowiedzi gdyby ktoś miał podobne pomysły jak jak :)
I oczywiście co chwila jestem troszeczkę lepszy.

Poniżej rozwiązanie łączące sed i awk. sed usuwa ostatnią linijkę, awk printuje (nową) ostatnią linię - czyli starą przedostatnią

sed '$d' file.txt | awk 'END {print}'

Sprawdzę jeszcze czy uda mi się zadanie wykonać dla samego awk
Tytuł: Odp: wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby
Wiadomość wysłana przez: 1709 w 2021-10-26, 00:15:17
$ PRZYKLAD=$(echo -e "Linia 1\nLinia 2\nLinia 3\nLinia 4") ; while read -r LINE ; do POPRZEDNIA="$NOWA" ; NOWA="$LINE" ; done <<< "$PRZYKLAD" ; echo "$POPRZEDNIA"
Linia 3

Tytuł: Odp: wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby
Wiadomość wysłana przez: 1709 w 2021-10-26, 00:55:03
Cytuj
i do końca nie rozumiem co i jak się tu dzieje, ...
sed '$!N;$!D' file.txt

https://linux.die.net/man/1/sed

Prawdopodobnie ...
Cytuj
n N

Read/append the next line of input into the pattern space.
Cytuj
D

Delete up to the first embedded newline in the pattern space. Start next cycle, but skip reading from the input if there is still data in the pattern space.