Chcę wiedzieć, ile czasu zajmie seria procesów na moim komputerze, aby zdecydować, czy mam tam działać, czy na silniejszym komputerze. Więc prognozuję czas działania każdego polecenia. Dane wyjściowe wyglądają następująco:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Jak mogę zsumować drugą kolumnę, aby uzyskać całkowity czas działania? Mógłbym spróbować przepuścić każdą linię
awk '{sum += $2 } END { print sum }
ale to nie ma sensu, ponieważ wartości nie są liczbami naturalnymi.
bash
time
arithmetic
je_b
źródło
źródło
Zakładając, że używasz wbudowanego polecenia bash „time”, zanim uruchomisz program, możesz
export TIMEFORMAT=%0R
. Dane wyjściowe będą następnie dodawane przez awk przez całe sekundy. Więcej informacji jest dostępnych w sekcji „Zmienne powłoki” na stronie podręcznika bash.źródło
Jeśli nie możesz (lub nie chcesz) użyć
TIMEFORMAT
swojego czasu, wystarczy przeliczyć czas na sekundy, a następnie dodać go razem. Na przykład wyjście rury przez:Lub jeśli chcesz, możesz wymienić ostatnie
echo
polecenie przezźródło
$[sum/60%60]
pozbawione godzin.Aktualizacja:
Oto nowa implementacja, która wykorzystuje
dc
„bazę wyjściową”. Zauważ, że jeśli łączna suma jest większa niż 60 godzin, spowoduje to wygenerowanie czterech wartości oddzielonych spacjami zamiast trzech. (A jeśli całkowita suma jest mniejsza niż jedna godzina, zostaną wyświetlone tylko dwie wartości rozdzielone spacjami.)Zakłada się, że dane wejściowe będą trzykrotnie godziny, minuty, sekundy, jak pokazano w pytaniu.
Dane wyjściowe na dostarczonym wejściu to:
Oryginalna odpowiedź:
Zróbmy to za pomocą
dc
kalkulatora biurkowego. Jest to back-endbc
i jest niezwykle elastyczny, choć często uważany za tajemniczy.Po pierwsze, niektóre wstępne przetwarzanie, aby podać tylko czasy i przekonwertować dwukropki na spacje:
Możemy to również zrobić za pomocą Sed:
Pójdę z Awk i
tr
ponieważ jest to prostsze. Każde z powyższych poleceń generuje czysty wynik w następującym formacie. (Używam własnego przykładowego tekstu, ponieważ uważam go za bardziej interesujący; zawiera godziny. Twój też będzie działał).Biorąc pod uwagę czasy w powyższym formacie, uruchom je za pomocą następującego skryptu Sed i potokuj wynik,
dc
jak pokazano:(Podzielone, aby zmniejszyć przewijanie w bok :)
Dane wyjściowe będą w sekundach, minutach, godzinach w tej sekwencji. (Zauważ, że jest to odwrócona sekwencja.) Właśnie się uczę,
dc
więc nie jest to idealne rozwiązanie, ale myślę, że jest całkiem dobry na pierwsze spojrzeniedc
.Przykładowe dane wejściowe i wyjściowe, wklejone bezpośrednio z mojego terminala:
źródło
Oto moje rozwiązanie - użyj
split()
. Drukowanie całkowitego czasu w sekundach:Drukowanie w przyjemnym formacie czasowym:
GNU awk obsługuje również strftime, ale użyje twojej bieżącej strefy czasowej, więc wyniki byłyby mylące.
źródło
gawk
z,TZ=UTC0 gawk...
aby usunąć problem strefy czasowej.Po prostu podziel i oblicz:
źródło
Odmiana tematów tutaj, ale więcej fajek
źródło
Prawie każda skorupa mogłaby wykonać matematykę:
Użyj
getseconds $=t
w zsh, aby podzielić.źródło