Saya mencoba memanipulasi file yang berisi angka dalam notasi ilmiah, tetapi tanpa e
simbol, yaitu 1.2e+3
ditulis sebagai 1.2+3
.
Hal termudah yang saya pikirkan awk
adalah mengganti +
dengan e+
, menggunakan gsub
fungsi dan melakukan perhitungan saya di file baru. Hal yang sama berlaku untuk case minus. Jadi perbaikan sederhana dapat dilakukan dengan menggunakan perintah berikut
awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in
dan lakukan hal yang sama di semua kolom.
Namun file tersebut juga berisi angka negatif yang membuat segalanya sedikit lebih rumit. File sampel dapat dilihat di bawah
1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6
2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4
3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6
4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6
6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5
7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5
9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5
9.248130+1 5.000000-1 3.069610-3 2.786329-2-6.317000-5
1.049935+2 5.000000-1 4.218794-2 3.321955-2-5.097000-6
1.216283+2 5.000000-1 1.432105-2 3.077165-2 4.300300-5
Adakah ide tentang cara memanipulasi dan perhitungan dengan file seperti itu?
text-processing
awk
Terima kasih
sumber
sumber
Jawaban:
Apakah output ini benar?
Kode:
Penjelasan:
-lne
urus ujung jalur, proses setiap jalur input, jalankan kode yang mengikutis/(\.\d+)(\+|\-)/\1e\2/g
:s
)(.\d+)(\+|\-)
temukan dua kelompok (titik dan angka) dan (plus atau minus)\1e\2
gantikan mereka dengan kelompok pertama kemudiane
kelompok keduag
secara global - jangan berhenti pada subtitusi pertama di setiap baris, tetapi proses semua hit yang mungkinprint
cetak garissample
masukan fileYang ini menambah ruang jika tidak ada. Bahkan itu membuat ruang di antara angka-angka terlepas. Yaitu. jika ada dua ruang dalam beberapa kasus, hanya akan ada satu di output.
Sebagian besar mirip dengan yang sebelumnya. Yang baru adalah
(\d+)
grup nr 3 dan(\s*)
grup nr 4. di*
sini berarti opsional. Dalam substitusi tidak\4
digunakan. Ada ruang sebagai gantinya.Outputnya adalah ini:
sumber
.
di grup pertama. Ini benar. Tanpa garis miring terbalik ini, titik tidak akan berarti titik literal.Anda juga dapat menggunakan
sed
, misalnya:Namun, ini tidak memperhitungkan bahwa kolom dalam daftar OP terkadang tidak dipisahkan. Berikut ini solusinya dengan presisi yang sesuai:
Keluaran:
sumber
2.698100-2-2.034300-4
OFMT
variabel untuk mengatur presisi awk sama dengan input