Saya mencoba mengekstrak beberapa data dari file yang terus diperbarui dan saya telah menemukan cara memfilter dua string dengan grep. Outputnya adalah sebagai berikut:
! total energy = -9744.24963670 Ry
convergence has been achieved in 188 iterations
! total energy = -9744.30001681 Ry
convergence has been achieved in 140 iterations
! total energy = -9744.33953891 Ry
convergence has been achieved in 155 iterations
! total energy = -9744.36584201 Ry
convergence has been achieved in 164 iterations
! total energy = -9744.37925372 Ry
convergence has been achieved in 154 iterations
! total energy = -9744.39185493 Ry
convergence has been achieved in 153 iterations
! total energy = -9744.39836617 Ry
convergence has been achieved in 160 iterations
Sekarang yang ingin saya lakukan adalah mengekstrak dari baris-baris ini angka-angka sebagai berikut:
dari baris yang dimulai dengan ! Saya ingin nomor di kolom no 5 dan dari baris berikutnya di grep output saya ingin nomor di kolom no 6.
Selanjutnya saya ingin angka-angka ini ditulis dalam file terpisah sebagai dua kolom terpisah sebagai:
188 -9744.24963670
140 -9744.30001681
155 -9744.33953891
164 -9744.36584201
Saya berpikir bahwa pendekatan dengan awk dengan mengulang semua hasil grep ini dan kemudian melihat baris bernomor ganjil dan mencetak kolom 5 dan kemudian untuk baris genap mencetak kolom 6. Tapi saya tidak tahu bagaimana melakukan ini.
Saya telah mencoba mengekstrak hasil individual ke dalam variabel secara terpisah:
var1=$(grep '!' input.file | awk '{print $5}')
dan
var2=$(grep 'convergence has been achieved' input.file | awk '{print $6}')
dan kemudian saya mencoba menulisnya ke file sebagai:
echo $var1 $var2 > data.dat
Namun hasilnya tidak seperti yang diharapkan:
188
140
155
164
154
153
160 -9744.24963670
-9744.30001681
-9744.33953891
-9744.36584201
-9744.37925372
-9744.39185493
-9744.39836617
Saya tidak tahu bagaimana menulisnya dalam formulir yang saya sebutkan di atas. Juga karena file terus diperbarui, saya membayangkan potongan kode untuk digabungkan dengan loop sementara hingga kondisi akhir (saya tahu bagaimana melakukan bagian terakhir ini)
Saya harap saya menjelaskan ini dengan jelas!
Jawaban yang Diterima:
awk solusi:
awk 'v && NR==n{ print $6,v > "result.txt" }/^!/{ v=$5; n=NR+1 }' file
-
<condition1> { <statement> ... }<condition2>{ <statement> ... }
– kondisi dengan pernyataan masing-masing akan dievaluasi secara berurutan -
/^!/{ v=$5; n=NR+1 }
– pada baris pertemuan yang dimulai dengan!
– ambil nilai bidang ke-5$5
dan rencanakan nomor baris berikutnyaNR+1
(menetapkan ke variabeln
) -
v && NR==n
– jika kita memiliki nomor penting pertamav
dan nomor rekor saat iniNR
adalah “nomor baris berikutnya” yang dibutuhkann
– cetak nilai ke dalam fileresult.txt
result.txt
isi file:
188 -9744.24963670
140 -9744.30001681
155 -9744.33953891
164 -9744.36584201
154 -9744.37925372
153 -9744.39185493
160 -9744.39836617