Nowe posty

Autor Wątek: Jak zsumować kolumnę?  (Przeczytany 9368 razy)

Hipek

  • Gość
Jak zsumować kolumnę?
« dnia: 2008-01-08, 13:00:59 »
Witam!

Potrzebuję zsumować jedną z kolumn wyrzucanych przez jakiś tam program. Jesli plik dane zawiera jedną spację pomiędzy kolumnami np:
login1 2000
login2 3000
login3 67
...
To wiem, jak to zrobić:
suma=0;
for i in `cat dane | cut -d " " -f 2`; do suma=`expr $suma+$i`; echo $suma;
done;
echo $suma
Ale co zrobić, jeśli między kolumnami jest więcej niż jedna spacja? Np taka lista:
login1   23
logiin2  22
loggiin3 21
Wtedy cut zwraca po części spacje...

Offline

  • Users
  • Guru
  • *****
  • Wiadomości: 825
    • Zobacz profil
Jak zsumować kolumnę?
« Odpowiedź #1 dnia: 2008-01-08, 13:08:24 »
Zmiast cut -d " " -f 2
awk '{print $2}'

M.

ZipoKing

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #2 dnia: 2008-01-08, 13:10:53 »
To poniżej działa ;)
suma=0;
liczba=0;
for wiersz in `cat dane.txt`;
do
  liczba=$[1-liczba];
  if [ $liczba == "0" ]; then
    suma=$[suma+wiersz];
  fi;
done;
echo $suma

arctgx

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #3 dnia: 2008-01-08, 13:22:18 »
 awk '{ suma+= $2 } END { print suma }' dane
ed: było 5 zamiast 2, bo testowałem na wyniku "ls -l".

arctgx

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #4 dnia: 2008-01-08, 13:57:06 »
Zipo, szybsze od zewnętrznego "cat" powinno być wewnętrzne polecenie przekierowania "<".

Zastanawiałem się, po jakiego grzyba ta "liczba". A okazuje się, że zmienna "wiersz" w pętli for to na każdym jej kroku wcale nie wiersz z pliku dane, a "słowo" (może inne ustawienie IFS zmieniłoby podział na słowa). W tym pliku słowo to jest na przemian tekstem lub liczbą i zależnie od tego zmienna "liczba" przestawiana jest albo na 0, albo na 1.

Hipek

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #5 dnia: 2008-01-08, 14:05:47 »
Cytat: arctgx
 awk '{ suma+= $2 } END { print suma }' dane
Jestem pod wrażeniem. Tak krótko i skutecznie :)

Bardzo dziękuję wszystkim za pomoc! Pozdrawiam!

arctgx

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #6 dnia: 2008-01-08, 14:25:53 »
Zabawiłem się w małe uogólnienie:
#!/bin/bash
suma=0;
liczba=0;
pozycja=5;
liczba_kolumn=8;
for wiersz in `< "$1"`;
do
        liczba=$[ ++liczba % liczba_kolumn ];
        if [ $liczba -eq $pozycja ]; then
                echo $wiersz
                suma=$[suma+wiersz];
        fi;
        #echo $liczba;
done;
echo $suma
% oznacza resztę z dzielenia, porównanie łańcuchowe "==" podmieniłem na arytmetyczne "-eq". Zmienna liczba zeruje się, kiedy osiąga wartość "liczba_kolumn" i leci od nowa w górę :)

ZipoKing

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #7 dnia: 2008-01-08, 14:50:58 »
Cytat: arctgx
Zabawiłem się w małe uogólnienie: (...)
Zauważ, że popełniłeś tutaj błąd, który może mieć duże konsekwencje; mianowicie odgórnie przyjąłeś, że pozycja=5, liczba_kolumn=8. Nigdzie nie jest powiedziane, że tak akurat ma być.

arctgx

  • Gość
Jak zsumować kolumnę?
« Odpowiedź #8 dnia: 2008-01-08, 15:21:02 »
Toż jasne, że to tylko przykładowe liczby, które można zmienić. Dlatego wyrzuciłem je na początek, by można było łatwo podmieniać, a nie bezpośrednio modyfikować wewnątrz instrukcji. Można by je zupełnie ładować z parametrów pozycyjnych, ale to już tylko kosmetyka.

Tajemnicze 5 i 8 pochodzą z listingu "ls -l".