Bir dosyadaki satırlardaki sayıları nasıl toplayabilirim


24

Buna benzeyen bir dosyam var:

1
3
4
1
4
3
1
2

Bunun toplamını nasıl bulabilirim (örn. 1 + 3 + 4 + 1 + 4 + 3 + 1 + 2 = 19)?


1
Bağlam için Stack Ubuntu API'sinden Ask Ubuntu'ya sorduğum rozetlerin sayısını sayıyorum.
Tim

İlecat badges.json | grep -o '"award_count":[0-9],"rank":"gold"' | grep -o [0-9]
Tim

Şimdi API'nin bir badge_countyöntemi olduğunu fark etsem de .
Tim

API'dan rozetleri sayıyorsanız, API'yi sorgulamak için kullandığınız dil bunu yapamaz (python, javascript)?
Braiam

Yanıtlar:


42

bcpasteçizgileri +ayırıcı olarak tek bir çizgide almak için küçük bir yardımla :

paste -sd+ file.txt | bc

grepStatik bir dosya yerine (veya başka bir komutun) çıktısını kullanmak için grep'nin STDOUT'unu STDIN'e iletin paste:

grep .... | paste -sd+ | bc

Örnek:

% cat file.txt            
1
3
4
1
4
3
1
2

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

Kullanmanız gerekiyorsa bash, dosya içeriğini kaydetmek için bir dizi kullanabilirsiniz ve ardından öğeler üzerinde yinelenir veya dosya satırını satır okuyabilir ve her satır için toplamı yapabilirsiniz, ikinci yaklaşım daha etkili olacaktır:

$ 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

HM güzel. Soruyu değiştirdiğim için özür dilerim: bunu grep çıktısını kabul edecek şekilde değiştirebilir miyim (veya benzer bir satır yapabilir cat file.txt | bcmiyim?
Tim

@Tim Düzenlemelerimi kontrol et
heemayl

Ta, bu basitti!
Tim

2
kullanmam gereken başka bir cevabı bulana kadar stdin yolu benim için işe yaramadı paste -sd+ -. Lütfen bunu değiştir.
Xerus

19

Siz de awk kullanabilirsiniz. "Merhaba" kelimesini içeren * .txt dosyalarındaki toplam satır sayısını saymak için :

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

Bir dosyadaki sayıları basitçe toplamak için:

awk '{n += $1}; END{print n}' file.txt

Fakat eğer bu satır "4" değerine sahipse 4 saymaz. 1'i sayacak.
Tim

Hayır, 4 sayar.
CrazyApe84

Bir dosyadaki sayıların toplamını istiyorum. Bunu yapar mı?
Tim

Sorunuzu grep çıkışına çevirdiğinizi sanıyordum. Bazı varsayımlar yapıyordum. Bir dosyadaki değerleri basitçe nasıl toplayacağımı ekleyeceğim.
CrazyApe84

2
Evet. Bu aslında heemayl'ınkiyle aynı cevabı, ama macun ve bc yerine sonuçta çok daha fazla esneklik veren awk'yi kullanıyor. Yine de cevabı iyidir ve oyunuzu hak ettiği için ilk önce oydu!
CrazyApe84

7

numsumPaketten kullanın num-utils!

(Gerekebilir sudo apt-get install num-utils)

Komut numsum, tam olarak ihtiyacınız olanı yapar;

$ numsum file.txt 
19

Test numaralarını satır satır okuma stdin:

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

Veya bir satırdan okuma:

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19


Daha fazla yardımcı program

Paket, daha iyi tanınmayı hak eden numara işleme için başka bazı yardımcı programlar içerir:

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

ve daha genel bir hesap komutu numprocess,
bu giriş hatlarında numaralarına komut satırı bir ifade de geçerlidir.


1

awkHer satırda desen içeren dosyaları taramak ve işlemek için yararlı olan yerel bir linux uygulamasını kullanabilirsiniz . Sorunuz için bu istediğinizi üretecektir:

awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }' file.txt

Borular da kabul edilir:

cat file.txt | awk 'BEGIN { sum=0 } { sum+=$1 } END {print sum }'

Bir BEGIN{}bloğa gerek yok , CrazyApe84'ün cevabını görün .
terdon

Bu soruna gerek yok ama didaktik bir amaç nedeniyle onu dahil etmeyi tercih ettim.
gwarah

Ama ne öğretiyor? Her problem için gereksizdir, awkC değildir, kullanmadan önce bir değişken ayarlamanıza gerek yoktur. Dene awk 'BEGIN{print c+=1}'.
terdon

BEGIN {}blok sadece değişkenleri başlatmak için tasarlanmamıştır. Tasarım şartnamesinde yer alır. Yani, bazı problemlerde ihtiyaç duyulabilir.
gwarah

0

Bu oldukça basit bir bashbetik kullanımıdır .

SUM=0; for line in `cat file.txt`; do SUM=$((SUM + line)); done

Bu, mevcut çözümden çok daha basit ve araç takımı minimalist.
Det

0

Perl çözümü:

$ perl -lnae '$c+=$_;END{print $c}' input.txt                                                                            
19

Yukarıdakiler birden fazla dosyadaki tüm sayıları toplayabilir:

$ perl -lnae '$c+=$_;END{print $c}' input.txt input2.txt                                                                 
34

Tek tek dosyada sayıların toplamını görmek istediğimiz komut satırında verilen birden fazla dosya için şunu yapabiliriz:

$ perl -lnae '$c+=$_;if(eof){printf("%d %s\n",$c,$ARGV);$c=0}' input.txt input2.txt                                      
19 input.txt
15 input2.txt

0

Basit -

awk '{total+=$1} END{print total}' file

sayıları toplar ve toplamı verir.


0

Basit bir yaklaşım, kabuğunuzun yerleşik bir özelliğini kullanmaktır:

SUM=0; while read N; do SUM=$((SUM+N)); done </path/to/file
echo $SUM

Bu, dosyanızı doğrusal olarak okur, özetler ve sonucu yazdırır.

Bir boru kullanmak ve sadece 1. sırayı kullanmak istiyorsanız, şunun gibi çalışır:

SUM=0
your_command | while read -r LINE; do for N in $LINE; do break; done; SUM=$((SUM+N)); done
echo $SUM

İlk elemanı almak şöyle yapılır:

LIST="foo bar baz"
for OBJ in $LIST; do break; done
echo $OBJ

foo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.