Nowe posty

Autor Wątek: wyświetlenie przedostatniej linijki pliku tekstowego na różne sposoby  (Przeczytany 732 razy)

Offline guest013

  • Nowy na forum
  • *
  • Wiadomości: 3
    • Zobacz profil
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ń?
« Ostatnia zmiana: 2021-10-25, 15:23:49 wysłana przez guest013 »

Offline guest013

  • Nowy na forum
  • *
  • Wiadomości: 3
    • Zobacz profil
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 ;)

Offline guest013

  • Nowy na forum
  • *
  • Wiadomości: 3
    • Zobacz profil
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

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2562
  • 1709
    • Zobacz profil
$ 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

PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2562
  • 1709
    • Zobacz profil
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.
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.