Każdy wiersz zawiera tekst i liczby w jednej kolumnie. Muszę obliczyć sumę liczb w każdym rzędzie. Jak mogę to zrobić? Dzięki
example.log zawiera:
time=31sec
time=192sec
time=18sec
time=543sec
Odpowiedź powinna wynosić 784
text-processing
awk
numeric-data
Jacek
źródło
źródło
Odpowiedzi:
Jeśli masz opcję
grep
wsparcia-o
, możesz spróbować:POSIXly:
źródło
W nowszej wersji (4.x) GNU
awk
:Z innymi
awk
s spróbuj:źródło
s+0
w przypadku, gdys
jest pusty, wydrukuje0
zamiast pustego.s
może być pusty; jeśli dane wejściowe nie zawierają wierszy (tj. jeśli w ogóle nie ma danych wejściowych ). W takim przypadku możliwe są dwa zachowania; 1) brak danych wejściowych => brak danych wyjściowych lub 2) zawsze coś wyjściowego, jeśli tylko 0. Oba są sensownymi opcjami w zależności od kontekstu aplikacji. Jest+0
to opcja adresowania 2). Aby rozwiązać opcję 1), wolisz pisaćEND {if(s) print s}
. - Dlatego nie ma sensu zakładać żadnej z opcji (w tym przypadku narożnym braku danych), dopóki nie zostanie to określone w pytaniu.źródło
time=1.4e5sec
Kolejny GNU
awk
:perl
Jeden:POSIX jeden:
źródło
źródło
sed
:awk --field-separator = '{ sum+=$2 } END { print sum}' data.dat
-F'='
zamiast--field-separator =
man awk
jedyny daje-F fs
i--field-separator fs
-F'='
lub-F '='
są na 2 sposoby-F fs
(w twoim przypadku fs to „=”). Dodałem pojedyncze cytaty, aby upewnić się, że fs jest poprawnie widziane i interpretowane przez awk, a nie powłokę (przydatne, jeśli fs to ';' na przykład)Możesz spróbować:
źródło
Wszyscy opublikowali niesamowite
awk
odpowiedzi, które bardzo mi się podobają.Odmiana do @cuonglm wymianie
grep
zsed
:sed
Paski wszystko z wyjątkiem numerów.paste -sd+ -
Komenda łączy wszystkie linie razem w jednej liniibc
Oblicza wyrażenieźródło
Powinieneś użyć kalkulatora.
Z czterema drukowanymi liniami:
I prościej:
... które drukuje ...
Jeśli szukasz prędkości, to właśnie
dc
tego chcesz. Tradycyjnie byłbc
to kompilator - i wciąż jest dostępny dla wielu systemów.źródło
dc
tak blisko, jak mogę powiedzieć. O czym mówisz?perl
ze standardowym zestawem narzędzi unix - naprawdę nie ma sensu, jeśli używasz narzędzi GNU skompilowanych w łańcuchu narzędzi GNU. Wszystkie wzdęcia, które mogą negatywnie wpłynąć na wydajność Perla, występują również we wszystkich narzędziach GNU skompilowanych przez GNU. Smutne ale prawdziwe. Potrzebujesz prawdziwego, prosto zbudowanego, prostego zestawu narzędzi, aby dokładnie ocenić różnicę. Jak na przykład zestaw narzędzi rodowych, statycznie powiązany z bibliotekami muzułmańskimi - w ten sposób możesz porównać paradygmat jedno narzędzie / jedno zadanie z jednym narzędziem, aby rządzić nimi wszystkimi.Poprzez python3,
źródło
re.findall
zwraca listę ciągów, to nie zadziałasum(int(e) for e in l)
jest bardziej pythonowy.Rozwiązanie Pure Bash (Bash 3+):
Krótka wersja:
źródło
PS4='$((x+=${time%s*}))' time=0 x=0 sh -x <infile