Saya ingin mengetahui jumlah total waktu yang dibutuhkan oleh serangkaian proses di komputer saya untuk memutuskan apakah saya harus berjalan di sana atau di komputer yang lebih kuat. Jadi, saya memperkirakan waktu menjalankan setiap perintah. Outputnya terlihat seperti:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Bagaimana saya bisa menjumlahkan kolom kedua untuk mendapatkan total waktu berjalan? Saya bisa mencoba menelusuri setiap baris
awk '{sum += $2 } END { print sum }
tetapi ini tidak masuk akal karena nilainya bukan bilangan asli.
bash
time
arithmetic
je_b
sumber
sumber
Dengan asumsi Anda menggunakan perintah builtin bash 'time', sebelum Anda menjalankan program, Anda bisa
export TIMEFORMAT=%0R
. Output kemudian akan ditambahkan dalam seluruh detik oleh awk. Informasi lebih lanjut tersedia di bagian 'Variabel Shell' pada halaman bash man.sumber
Jika Anda tidak dapat (atau tidak mau) menggunakan
TIMEFORMAT
hanya perlu mentransfer waktu ke detik, kemudian tambahkan bersama. Misalnya keluaran pipa melalui:Atau jika Anda ingin dapat bertukar
echo
perintah terakhir dengansumber
$[sum/60%60]
mencabut jam kerja.Memperbarui:
Berikut ini adalah implementasi baru yang memanfaatkan
dc
"basis output". Perhatikan bahwa jika jumlah total lebih dari 60 jam, ini akan menampilkan empat nilai yang dipisahkan oleh ruang alih-alih tiga. (Dan jika jumlah total kurang dari satu jam, hanya dua nilai yang dipisahkan ruang akan menjadi output.)Input diasumsikan dalam tiga kali lipat jam, menit, detik, seperti yang ditunjukkan dalam pertanyaan.
Output pada input yang disediakan adalah:
Jawaban asli:
Ayo lakukan ini dengan
dc
Desk Calculator Anda. Ini adalah back-end untukbc
, dan itu sangat fleksibel meskipun sering dianggap samar.Pertama, beberapa pra-pemrosesan untuk memberikan waktu saja, dan mengubah titik dua menjadi spasi:
Kita juga bisa melakukan ini dengan Sed:
Saya akan pergi dengan Awk dan
tr
karena lebih sederhana. Salah satu dari perintah di atas menghasilkan output bersih dalam format berikut. (Saya menggunakan contoh teks saya sendiri karena saya menganggapnya lebih menarik; sudah termasuk jam. Anda akan bekerja juga.)Diberikan waktu dalam format di atas, jalankan melalui script Sed berikut dan kirimkan hasilnya
dc
seperti yang ditunjukkan:(Rusak untuk mengurangi pengguliran ke samping :)
Outputnya adalah detik, menit, jam, dalam urutan itu. (Perhatikan ini adalah urutan terbalik.) Saya baru belajar
dc
jadi ini bukan solusi yang sempurna, tapi saya pikir ini cukup bagus untuk dilihat pertama kalidc
.Contoh input dan output, disisipkan langsung dari terminal saya:
sumber
Inilah solusi saya - gunakan
split()
. Mencetak total waktu dalam detik:Mencetak dalam format waktu yang bagus:
GNU awk juga mendukung strftime, tetapi ini akan menggunakan zona waktu Anda saat ini, sehingga hasilnya akan membingungkan.
sumber
gawk
denganTZ=UTC0 gawk...
untuk menghapus masalah zona waktu.Pisahkan dan hitung saja:
sumber
Variasi pada tema di sini, tetapi lebih banyak pipa
sumber
Hampir semua shell dapat melakukan perhitungan:
Gunakan
getseconds $=t
di zsh untuk membelahnya.sumber