Programowanie > Bash, skrypty powłoki
wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby
(1/1)
guest013:
Witam,
chciałbym prosić o podpowiedź odnośnie tematu tego wątku.
Ogólnie rzecz biorąc wiem jak to wykonać:
--- Kod: ---
tail -2 file.txt | head -1
--- Koniec kodu ---
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).
--- Kod: ---
sed '$!N;$!D' file.txt
--- Koniec kodu ---
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ń?
guest013:
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:
--- Kod: ---
sed -n 'x;$p' file.txt
--- Koniec kodu ---
Ale z awk będzie trudniej, i liczę na pomoc ;)
guest013:
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ą
--- Kod: ---
sed '$d' file.txt | awk 'END {print}'
--- Koniec kodu ---
Sprawdzę jeszcze czy uda mi się zadanie wykonać dla samego awk
1709:
--- Kod: ---
$ 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
--- Koniec kodu ---
1709:
--- Cytuj --- i do końca nie rozumiem co i jak się tu dzieje, ...
--- Kod: ---
sed '$!N;$!D' file.txt
--- Koniec kodu ---
--- Koniec cytatu ---
https://linux.die.net/man/1/sed
Prawdopodobnie ...
--- Cytuj ---n N
Read/append the next line of input into the pattern space.
--- Koniec cytatu ---
--- 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.
--- Koniec cytatu ---
Nawigacja
Idź do wersji pełnej