Nowe posty

Autor Wątek: Bash - plik wsadowy, interpretacja danych tekstowych  (Przeczytany 5936 razy)

Vigl

  • Gość
Bash - plik wsadowy, interpretacja danych tekstowych
« dnia: 2009-07-07, 11:31:08 »
Witam. :)
Mam za zadanie stworzyć pełnowartościowy program wsadowy w bashu, który najpierw pobiera dane z pliku tekstowego (nieważne już co tam w nim było na początku), następnie uruchamia program w Javie, który napisałem ostatnio, za pomocą którego tworzy się 8 "odsyfionych" plików tekstowych wyglądających w ogólności tak:
czas w timestampie; wartość (w double, ale to już w bashu nieistotne pewnie) - i takie dwie kolumny (w różnych plikach różna ilość wierszy). Teraz moim zadaniem jest wyłuskać z tych wartości (oczywiście w każdym pliku) maksimum, minimum, średnią arytmetyczną (geometryczna też byłaby mile widziana), obliczyć średni czas pomiędzy wystąpieniami kolejnych wartości i stworzyć wykresy przedstawiające czas i wartość od numera cyklu (czyli nr. wystąpienia kolejnej wartości - czyli po prostu w funkcji numeru wiersza). To wszytko ma się ładnie odpalać z pliku wsadowego.

O ile z gnuplotem sobie w miarę radzę (choć nie wiem czy wystarczająco), nie wiem jak się za to w bashu zabrać. Byłbym wdzięczny choćby za rady, jakich funkcji użyć w poszczególnych krokach - w reszcie man pomoże. Poza tym jestem łysy z plików wsadowych - jakieś rady? W ogóle da się to wszystko zrobić w bashu? :)

arctgx

  • Gość
Bash - plik wsadowy, interpretacja danych tekstowych
« Odpowiedź #1 dnia: 2009-07-07, 12:17:09 »
Na upartego, może nawet poradziłbyś sobie wewnętrznymi poleceniami basha (pisząc sobie obsługę różnych formatów liczb niecałkowitych), ale specjalnym narzędziem do takich robótek zdaje się być awk. Znajomość powłoki przyda się jednak nawet, gdy skorzystasz z awka.

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Bash - plik wsadowy, interpretacja danych tekstowych
« Odpowiedź #2 dnia: 2009-07-07, 12:42:30 »
> w double, ale to już w bashu nieistotne pewnie

To jest istotne. Zarówno Bash, jak i najczęściej używane polecenie liczące `expr` operuje jedynie na wartościach całkowitych. Ale polecenie `bc` pozwala używać dowolnych typów.

Możesz wczytywać plik po linii, a z każdej linii wybierać wartość poleceniem `awk`. Potem sumujesz, znajdujesz maksima i minima. Na końcu używasz sumy i ilości wierszy do policzenia średniej:
#!/bin/bash
k=0
suma="0.0"
while read linia; do
  wartosc=$( echo "$linia" | awk "{ print \\$2 }" )
  suma=$( echo "$suma + $wartosc" | bc )
  if [ $k -eq 0 ]; then
    min="$wartosc"
    max="$wartosc"
  else
    if [ $( echo "$wartosc < $min" | bc ) == "1" ]; then
      min="$wartosc"
    fi
    if [ $( echo "$wartosc > $max" | bc ) == "1" ]; then
      max="$wartosc"
    fi
  fi
  [...]
  ((k++))
done < plik.txt
srednia=$( echo "scale=10; $suma / $k" | bc )
echo "K = ${k}"
echo "SUMA = ${suma}"
echo "MIN = ${min}"
echo "MAX = ${max}"
echo "SREDNIA = ${srednia}"
[...]

arctgx

  • Gość
Bash - plik wsadowy, interpretacja danych tekstowych
« Odpowiedź #3 dnia: 2009-07-07, 12:58:29 »
Czy nie prościej zamiast
while read linia; do
  wartosc=$( echo "$linia" | awk "{ print \\$2 }" )
dać
while read timestamp wartosc reszta_kolumn; do
by od razu złapać wartość i obejść się już bez awka?

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
Bash - plik wsadowy, interpretacja danych tekstowych
« Odpowiedź #4 dnia: 2009-07-07, 19:00:34 »
Fakt :)