bcz niewielką pomocą, pasteaby uzyskać linie w jednym z +separatorem:
paste -sd+ file.txt | bc
Aby użyć wyniku grep(lub dowolnej innej komendy) zamiast pliku statycznego, przekaż grepSTDOUT do STDIN w paste:
grep ....| paste -sd+| bc
Przykład:
% cat file.txt
13414312% paste -sd+ file.txt | bc
19% grep . file.txt | paste -sd+| bc
19
Jeśli musisz użyć bash, możesz użyć tablicy do zapisania zawartości pliku, a następnie iteracji po elementach lub możesz odczytać plik linia po linii i wykonać sumę dla każdej linii, drugie podejście byłoby bardziej wydajne:
$ time { nums=$(<file.txt);for i in ${nums[@]};do(( sum+=i ));done; echo $sum ;}19
real 0m0.002s
user 0m0.000s
sys 0m0.000s
$ time {while read i;do(( sum+=i ));done<file.txt; echo $sum ;}19
real 0m0.000s
user 0m0.000s
sys 0m0.000s
Ale jeśli ten wiersz ma wartość „4”, nie będzie liczony 4, będzie. Będzie się liczyć 1.
Tim
Nie, to się liczy 4.
CrazyApe84,
Chcę sumę liczb w pliku. Czy to to robi?
Tim
Myślałem, że zmieniłeś swoje pytanie na wyjście grep. Robiłem pewne założenia. Dodam, jak po prostu zsumować wartości w pliku.
CrazyApe84,
2
Tak. To naprawdę ta sama odpowiedź co heemayl, ale zamiast wkleić i bc używa awk, co ostatecznie daje o wiele większą elastyczność. Mimo to jego odpowiedź jest dobra i był pierwszy, więc zasługuje na twój głos!
CrazyApe84,
7
Użyj numsumz paczki num-utils!
(Być może trzeba sudo apt-get install num-utils)
Komenda numsumdomyślnie wykonuje dokładnie to, czego potrzebujesz;
$ numsum file.txt
19
Odczytywanie liczb testowych linia po linii z stdin:
$ printf '
1
3
4
1
4
3
1
2'| numsum
19
Lub czytanie z jednej linii:
$ printf '1 3 4 1 4 3 1 2'| numsum -r
19
Więcej narzędzi
Pakiet zawiera inne narzędzia do przetwarzania liczb, które zasługują na większą popularność:
numaverage - find the average of the numbers, or the mode or median
numbound - find minimum of maximum of all lines
numgrep - to find numbers matching ranges or sets
numinterval - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom - random numbers from ranges or sets, eg odd.
numrange - similar to seq
numround - round numbers up, down or to nearest
oraz bardziej ogólne polecenie kalkulatora numprocess,
które stosuje wyrażenie z wiersza poleceń do liczb w wierszach wprowadzania.
Możesz użyć awkrodzimej aplikacji linux przydatnej do skanowania i przetwarzania plików ze wzorem w linii. W przypadku twojego pytania wygeneruje to, co chcesz:
awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt
Rury są również akceptowane:
cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'
Jest zbędny w stosunku do tego problemu, ale wolałem go uwzględnić ze względu na cel dydaktyczny.
gwarah
Ale czego to uczy? Jest redundantny dla każdego problemu, awknie jest C, nie trzeba ustawiać zmiennej przed użyciem. Spróbować awk 'BEGIN{print c+=1}'.
terdon
BEGIN {}blok nie został zaprojektowany tylko do inicjowania zmiennych. Bierze udział w specyfikacji projektu. W przypadku niektórych problemów może to być potrzebne.
gwarah
0
Jest to dość proste użycie bashskryptów.
SUM=0;for line in`cat file.txt`;do SUM=$((SUM + line));done
cat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
badge_count
metodę.Odpowiedzi:
bc
z niewielką pomocą,paste
aby uzyskać linie w jednym z+
separatorem:Aby użyć wyniku
grep
(lub dowolnej innej komendy) zamiast pliku statycznego, przekażgrep
STDOUT do STDIN wpaste
:Przykład:
Jeśli musisz użyć
bash
, możesz użyć tablicy do zapisania zawartości pliku, a następnie iteracji po elementach lub możesz odczytać plik linia po linii i wykonać sumę dla każdej linii, drugie podejście byłoby bardziej wydajne:źródło
cat file.txt | bc
?paste -sd+ -
. Proszę to poprawić.Możesz także użyć awk. Aby policzyć całkowitą liczbę wierszy w plikach * .txt zawierających słowo „cześć”:
Aby po prostu zsumować liczby w pliku:
źródło
Użyj
numsum
z paczkinum-utils
!(Być może trzeba
sudo apt-get install num-utils
)Komenda
numsum
domyślnie wykonuje dokładnie to, czego potrzebujesz;Odczytywanie liczb testowych linia po linii z
stdin
:Lub czytanie z jednej linii:
Więcej narzędzi
Pakiet zawiera inne narzędzia do przetwarzania liczb, które zasługują na większą popularność:
oraz bardziej ogólne polecenie kalkulatora
numprocess
,które stosuje wyrażenie z wiersza poleceń do liczb w wierszach wprowadzania.
źródło
Możesz użyć
awk
rodzimej aplikacji linux przydatnej do skanowania i przetwarzania plików ze wzorem w linii. W przypadku twojego pytania wygeneruje to, co chcesz:Rury są również akceptowane:
źródło
BEGIN{}
blokowania, patrz odpowiedź CrazyApe84 .awk
nie jest C, nie trzeba ustawiać zmiennej przed użyciem. Spróbowaćawk 'BEGIN{print c+=1}'
.BEGIN {}
blok nie został zaprojektowany tylko do inicjowania zmiennych. Bierze udział w specyfikacji projektu. W przypadku niektórych problemów może to być potrzebne.Jest to dość proste użycie
bash
skryptów.źródło
Rozwiązanie Perla:
Powyższe może sumować wszystkie liczby w wielu plikach:
W przypadku wielu plików podanych w wierszu poleceń, w których chcemy zobaczyć sumę liczb w poszczególnych plikach, możemy to zrobić:
źródło
Prosty -
dodaje liczby i daje sumę.
źródło
Prostym podejściem jest użycie wbudowanej funkcji powłoki:
Spowoduje to odczytanie pliku linii, podsumowanie i wydrukowanie wyniku.
Jeśli chcesz użyć potoku i używać tylko pierwszego wiersza, działa to tak:
Uzyskanie pierwszego elementu odbywa się w następujący sposób:
źródło