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

[0] Indeks wiadomości

Idź do wersji pełnej