Saya memiliki file yang hanya berisi dua baris, dengan struktur berikut:
$ cat /tmp/pwpower.log
000D6F0000D34227, -114.10
000D6F0001A405C4, -130.09
Nilai-nilai tersebut adalah nilai daya pembangkit listrik tenaga surya saya. Nilai negatif berarti generasi.
Saya membutuhkan nilai yang diekstrak melalui grep / sed / awk - apa pun cara yang paling cerdas. Saya perlu kedua nilai diekstraksi secara terpisah dan tanpa tanda minus.
Apa yang saya lakukan sekarang agak bodoh tetapi berhasil - saya yakin banyak dari Anda akan memiliki cara yang lebih cerdas untuk saya :-) Di sini tentu saja saya hanya melihat nilai plus Minus.
Untuk mendapatkan nilai pertama:
cat /tmp/pwpower.log |grep -o "\-.*" | head -n 1
Untuk mendapatkan nilai kedua:
cat /tmp/pwpower.log |grep -o "\-.*" | tail -n1
Dan pertanyaan terkait, apakah ada cara sederhana untuk mengambil STRING dan mentransformasikannya sehingga saya dapat menghitung SUM?
sumber
-F-
akan dilakukan.tr -d "- "
terlebih dahulu.-F-
.Anda dapat menggunakan
cut
untuk memilih kolom angka 2, danpaste -sd+
untuk membuat serangkaian angka untuk ditambahkan bersama. Alatbc
tersebut kemudian dapat digunakan untuk melakukan perhitungan.Bagaimana itu bekerja
Pilih angka dari kolom ke-2.
Format ulang menjadi satu baris dengan
+
masuk di antara setiap nomor:Melakukan perhitungan:
Untuk mendapatkan nilai absolut:
Jika format file
pwpower.log
dijamin Anda bisacut
melakukan menghilangkan tanda minus:sumber
Pendekatan KISS
sumber
Saya suka perintah grep Anda, tetapi bisa ditingkatkan untuk menghapus tanda minus, dan bekerja dalam kasus ketika tidak ada tanda minus. Ekspresi reguler yang diperluas tersedia dalam GNU grep dengan
-E
bendera memungkinkan kami untuk mencocokkan nomor dengan lebih tepat.Ini sedikit lebih efisien untuk tidak menggunakan cat, tetapi meneruskan nama file sebagai argumen ke perintah pertama dan biarkan membaca file. Itu juga terjadi pada saya bahwa jika Anda hanya berurusan dengan baris pertama atau terakhir dari file, lebih masuk akal untuk menggunakan
head
atautail
perintah terlebih dahulu sehingga Anda hanya perlu mencocokkan satu baris dengangrep
.Nilai pertama:
Nilai terakhir:
Jumlah (dengan perintah awk dari sini ):
sumber
Ini akan melakukan perhitungan tanpa minus.
Saya pikir memotong lebih cepat daripada awk, secara umum
sumber
awk
adalah alat yang tepat, tetapi jumlahnya mungkin bisa positif (kanan?), yang berarti Anda tidak ingin menggunakan tanda minus sebagai pemisah bidang. Alih-alih, gunakan koma sebagai pemisah bidang, lalu negasikan setiap nilai secara numerik -awk
akan secara otomatis mengonversi string menjadi angka untuk Anda:Jika kebetulan ada angka positif, mereka akan keluar negatif. Jika Anda hanya menginginkan jumlahnya,
awk
dapat melakukannya juga:sumber
sqrt($2^2)
sebagai trik untuk mendapatkan nilai absolut.Untuk menjumlahkan dua nilai:
sumber
awk
?bc
=)awk
?echo $(cut -d- -f2 file | tr '\n' '+')0 | bc
cut
? Gunakan[insert_cmd_here]
sebagai gantinya, buat loop subkulit, ciptakan matematika baru, gunakan kluster manusia atau aritmatika mental, sambungkan pikiran saya ke dalambc
. Mengapa kita melakukan banyak hal? Tidak ada alasan untuk membuat jawaban saya salah.Anda dapat menggunakan sed juga
sumber