GNU/Linux >> Belajar Linux >  >> Linux

Awk Dari Baris Yang Berbeda?

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 berikutnya NR+1 (menetapkan ke variabel n )

  • v && NR==n – jika kita memiliki nomor penting pertama v dan nomor rekor saat ini NR adalah “nomor baris berikutnya” yang dibutuhkan n – cetak nilai ke dalam file result.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

Linux
  1. Hapus Beberapa Baris Pertama Secara Efisien Dari File Teks?

  2. Gambarkan Secara Acak Sejumlah Garis Dari File Data?

  3. Menghapus Baris Tertentu dari File di Baris Perintah Linux

  1. Perintah wc Linux

  2. Daftar baris hanya dari satu file di DIFF

  3. Bagaimana install -c berbeda dari cp

  1. Bagaimana Cara Cat File Dari Awk?

  2. Hitung Baris Dalam File?

  3. ekstrak baris dari bawah hingga regex cocok