Min_max przy pomocy podprogramów

Min_max przy pomocy podprogramów
AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 92
0

Witam,

w BASHu potrzebuję wczytać plik z liczbami (w każdym wierszu jedna) i policzyć max i min.

Przyjąłem startowo, że max i min równa się liczbie z pierwszego wiersza.
Potem przy użyciu while porównywałem każdą kolejną liczbę (tail w połaczenie z wc-l + head) i jeżeli była większa/mniejsza niż min/max to stawała się min/max.
Aby to zadziałało zbiór wc - l malał stale o 1.

Nie wiem czy to optymalna metoda ale działa.

Jak natomiast zrobić to samo dla wielu plików ale - uwaga - wykorzystując podprogramy.

Myślałem nad tym i szczerze powiedziawszy nie znalazłem powodu aby to komplikować skoro w kodzie wystarczy $1 zastąpić przez $@ (wszystko ładnie liczy).
Czy coś upraszczam? O czymś nie wiem? Jak ewentualnie miałoby wyglądać zastosowanie podprogramów w tym wypadku?

Będę wdzięczny za pomoc.

Pozdrawiam,
Arek

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Nie wiem czy to optymalna metoda ale działa.

Mam nadzieje że żartujesz :D Bo zamiast wczytać plik i zrobić pętlę po jego liniach, a ty odpalasz n razy tail, head i wc. Ciekawi mnie czy istnieje mniej wydajne rozwiązanie :D

Jeśli chodzi o podprogramy to pewnie idea jest taka zeby liczyc to równolegle dla wszystkich plików, poprzez odpalenie dla każdego z nich osobnego skryptu.

AR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 92
0
Shalom napisał(a):

Nie wiem czy to optymalna metoda ale działa.

Mam nadzieje że żartujesz :D Bo zamiast wczytać plik i zrobić pętlę po jego liniach, a ty odpalasz n razy tail, head i wc. Ciekawi mnie czy istnieje mniej wydajne rozwiązanie :D

Jeśli chodzi o podprogramy to pewnie idea jest taka zeby liczyc to równolegle dla wszystkich plików, poprzez odpalenie dla każdego z nich osobnego skryptu.

Przy poziomie wiedzy jaki prezentuję nie stać mnie jeszcze na żarty:)
Chętnie się dowiem jak zrobić pętle po wierszach- nie umiałem tak zrobić.

Co do podprogramów to wynik ma być wspólny dla wszystkich plików - nie dla każdego niezależnie.

Pozdrawiam,
Arek

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
0

Moja pierwsza "optymalizacja" skryptu basha :-)

Kopiuj
#!/bin/bash
firstln=1
max=0
min=0

if [ -f $1 ] ;
then
    while read -r LINE || [[ -n $LINE ]]; do
        val=$( echo $LINE )
        if [ $firstln -eq 0 ] ; then
            if [ $val -gt $max ] ; then 
              max=$val
            fi
            if [ $val -lt $min ] ; then 
              min=$val
            fi
        else
          max=$val
          min=$val 
          firstln=0
        fi
    done < $1
    else
        echo "No file found"
fi

if [ $firstln -eq 0 ] ; then
   echo "Min: $min, max: $max"
else
   echo "No values found"
fi

Na podstawie: http://unix.stackexchange.com/questions/144834/compare-two-numbers-read-from-a-file

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.