[Bash] usuwanie ostatniego wiersza?

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
LukAs
Wytworny Kaczor
Wytworny Kaczor
Posty: 284
Rejestracja: 30 paź 2005, 21:56
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

[Bash] usuwanie ostatniego wiersza?

Post autor: LukAs »

Króciutko i na temat.

Mam w programie skryptowym pętle, która wykonuje się tyle razy ile jest plików z danymi. W pętli jest druga pętla, która wykonuje się tyle razy ile jest wierszy w pliku. Po każdym wykonania drugiej pętli dopisywane są 3 wiersze z danymi. Wszystko ląduje do pliku /tmp/tymczasowy_plik, po czym jest ponownie wczytanie i dopisane do tego samego pliku. Problem w tym, że miedzy oryginalnym, pierwszym tekstem, a drugim, który został doklejony nie powinno być 3 w/w wierszy, a całkiem coś innego. Tak jakby jakiś separator.

Tak to teoretycznie wygląda:

Kod: Zaznacz cały

read PLIKI #podaje ile jest plików

 X=1
 while [ $X -le $PLIKI ]; do 
   
read  DANE #podaje nazwę pliku nr. $X
	x=1
	while [ $x -le $wiersze ]; do
         funkcja przetwarza dane
	x=$[x+1]
	done
	  fumkcja dopisuje dane
 X=$[X+1]
 done
Mówiąc krótko, po wykonaniu się wszystkich pętli, chcę z pliku /tmp/tymczasowy_plik wykasować 3 ostatnie linie.

Dodam, że program ma ponad 400 linii kodu i 90% to sed, a nie mogę sobie poradzić ;-)
Więcej o mnie znajdziesz na: http://ospulse.pl
Awatar użytkownika
DNADesigNed
Sędziwy Jeż
Sędziwy Jeż
Posty: 84
Rejestracja: 30 sie 2007, 17:01
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: LXDE
Architektura: x86
Kontakt:

Odp: [Bash] usuwanie ostatniego wiersza?

Post autor: DNADesigNed »

Trochę tak na około, ale znalazłem trik przy pomocy polecenia head. Napisałem, że na około, ponieważ operacja odbywa się na gotowych plikach i strumieniach, zamiast "w locie". Chodzi o wykorzystanie parametrów polecenia head do wycięcia tych ostatnich linijek:

Kod: Zaznacz cały

 cat plik_wejsciowy | head -n-3 > plik_wyjsciowy 
Analogicznie można za pomocą tail wyciąć n pierwszych linii (np. tail -n+2 wytnie pierwsze 2 linie z pliku).

Możesz też spróbować ograniczyć pętlę przetwarzającą wiersze do konkretnej liczby wierszy, np. pobrać sobie z pliku liczbę wierszy i zmniejszyć ją o 3:

Kod: Zaznacz cały

 LW=`cat plik_wejsciowy | wc -l`
 LW=$[LW-3]
Taki sposób jednak nie jest tym najwydajniejszym. ;)
Pozdrawiam
Piotr "MoroS" Mrożek - http://dnadesign.pl/
LukAs
Wytworny Kaczor
Wytworny Kaczor
Posty: 284
Rejestracja: 30 paź 2005, 21:56
Płeć: Mężczyzna
Wersja Ubuntu: 10.04
Środowisko graficzne: GNOME
Architektura: x86_64
Kontakt:

Odp: [Bash] usuwanie ostatniego wiersza?

Post autor: LukAs »

Z odjęciem od rzeczywistej ilości wierszy 3 i podstawieniem wyniku z użyciem sed, tail myślałem wcześniej (podobne myślenie, troszkę inne wykonanie). Nie sprawdzałem tego (czy w ogóle da się tak?) bo skoro sed i head potrafią zrobić tak proste operacje jak "wyświetl lub nie kilka pierwszych wierszy", to dlaczego tail nie umiałby w drugą stronę. Myślałem też o odwróceniu zawartości całego pliku, usunięciu pierwszych 3 wierszy i powrocie do pierwszej postaci.

Tak naprawdę, to przed pętlą nr 2. jest funkcja, która liczy linie (wiersze), dzieli przez 5 i podstawia do pętli. Wiersze zawsze występują w postaci 5,10,15,20...N, więc mogłem sobie na to pozwolić.

Edit. Działa (head -n-3) za co wielkie podziękowania. Musze tworzyć dodatkowy tymczasowy plik (robi się bałagan w kodzie), z którego dopiero wczytuje dane bez 3 ostatnich wierszy, ale dobrze, że problem z głowy.

Pozdrawiam ;)
Więcej o mnie znajdziesz na: http://ospulse.pl
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości