Setiap baris berisi teks dan angka dalam satu kolom. Saya perlu menghitung jumlah angka di setiap baris. Bagaimana saya bisa melakukan itu? Terima kasih
example.log berisi:
time=31sec
time=192sec
time=18sec
time=543sec
Jawabannya harus 784
text-processing
awk
numeric-data
Mendongkrak
sumber
sumber
Jawaban:
Jika opsi
grep
dukungan-o
Anda, Anda dapat mencoba:POSIXly:
sumber
Dengan versi GNU yang lebih baru (4.x)
awk
:Dengan
awk
percobaan lain:sumber
s+0
dalam kasus di manas
kosong, itu akan mencetak0
bukannya kosong.s
bisa kosong; jika input data tidak mengandung garis (yaitu jika tidak ada input sama sekali ). Dalam hal ini ada dua perilaku yang mungkin; 1) tidak ada input => tidak ada output, atau 2) selalu mengeluarkan sesuatu, jika hanya 0. Keduanya merupakan opsi yang masuk akal tergantung pada konteks aplikasi. The+0
adalah menangani opsi 2). Untuk mengatasi opsi 1) Anda lebih suka menulisEND {if(s) print s}
. - Oleh karena itu tidak masuk akal untuk mengasumsikan salah satu opsi (untuk kasus sudut ini tidak ada data) sampai ditentukan oleh pertanyaan.sumber
time=1.4e5sec
Satu lagi GNU
awk
:Satu
perl
:Yang POSIX:
sumber
sumber
sed
:awk --field-separator = '{ sum+=$2 } END { print sum}' data.dat
-F'='
daripada--field-separator =
man awk
hanya memberi-F fs
dan--field-separator fs
-F'='
atau-F '='
ada 2 cara untuk melakukan-F fs
(fs adalah "=" dalam kasus Anda). Saya menambahkan singlequotes untuk memastikan fs benar dilihat & ditafsirkan oleh awk, bukan shell (berguna jika fs adalah ';' misalnya)Anda dapat mencoba ini:
sumber
Setiap orang telah memposting
awk
jawaban yang luar biasa , yang sangat saya sukai.Variasi untuk @cuonglm diganti
grep
dengansed
:sed
strip segala sesuatu kecuali untuk nomor.paste -sd+ -
perintah bergabung semua lini bersama-sama sebagai satu barisbc
mengevaluasi ekspresisumber
Anda harus menggunakan kalkulator.
Dengan empat baris Anda yang mencetak:
Dan lebih sederhana:
... yang mencetak ...
Jika kecepatan adalah apa yang Anda cari maka
dc
itu yang Anda inginkan. Secara tradisional itu adalahbc
kompiler - dan masih untuk banyak sistem.sumber
dc
saya tahu. Apa yang sedang Anda bicarakan?perl
terhadap standar unix toolset - benar-benar tidak masuk akal jika Anda menggunakan alat GNU yang dikompilasi di rantai alat GNU. Semua mengasapi yang secara negatif dapat mempengaruhi kinerja Perl juga di semua util GNU yang dikompilasi. Sedih tapi benar. Anda memerlukan toolset nyata, sederhana dibangun, sederhana untuk menilai perbedaan secara akurat. Sebagai contoh, set alat pusaka yang secara statis terhubung dengan musl libs misalnya - dengan cara itu Anda dapat menempatkan paradigma satu-alat / satu-pekerjaan vs satu-alat-untuk-memerintah-semuanya-semuanya.Melalui python3,
sumber
re.findall
mengembalikan daftar string, ini tidak akan berfungsisum(int(e) for e in l)
lebih pythonic.Solusi bash murni (Bash 3+):
Versi pendek:
sumber
PS4='$((x+=${time%s*}))' time=0 x=0 sh -x <infile