Saya mencoba mengikuti solusi di

Memindahkan baris yang cocok dalam file teks menggunakan sed

Situasinya adalah bahwa pattern2 perlu diterapkan hanya sekali di seluruh file. Bagaimana saya bisa mengubah yang berikut ini untuk menyelesaikannya

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ {t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

Ini adalah file tempat saya menerapkan pattern2 (RELOC_DIR)

asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
RELOC_DIR = /i/j/k/l/m
asdasd3
asdasd4
DEFAULTS {
asdasd6
$(RELOC_DIR)/some other text1
$(RELOC_DIR)/some other text2
$(RELOC_DIR)/some other text3
$(RELOC_DIR)/some other text4

Dan 4 baris terakhir file terhapus karena kecocokan.

asdasd0
-SRC_OUT_DIR = /a/b/c/d/e/f/g/h
asdasd3
asdasd4
DEFAULTS {
RELOC_DIR = /i/j/k/l/m
asdasd6
0
tulamba 14 Maret 2019, 05:36

1 menjawab

Jawaban Terbaik

Saya berasumsi Anda perlu memeriksa pattern2 bersama dengan beberapa kondisi lain jika ini masalahnya, cobalah.

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && /check_other_text_in_current_line/{t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

Di atas sedang memeriksa check_other_text_in_current_line string (yang merupakan sampel dan Anda dapat mengubahnya sesuai string Anda yang sebenarnya) ada bersama dengan pattern2 juga di baris yang sama. Jika ini bukan yang Anda cari, silakan posting contoh input dan output yang diharapkan di posting Anda.



ATAU jika Anda mencari bahwa hanya 1 yang cocok untuk pattern2 di Input_file dan lewati semua yang lain, lalu coba. Ini hanya akan mencetak kecocokan pertama untuk pattern2 dan melewatkan semua yang lain. (karena sampel tidak disediakan oleh OP sehingga kode ini ditulis hanya untuk permintaan pencocokan pola tertentu)

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && ++count==1{t[2]=$0;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file

ATAU

awk '/pattern1/ {t[1]=$0;next}
     /pattern2/ && !found2{t[2]=$0;found2=1;next}
     /pattern3/ {t[3]=$0;next}
     /target3/ { print t[3] }
     1
     /target1/ { print t[1] }
     /target2/ { print t[2] }' file


EDIT: Meskipun solusi ke-2 saya sepertinya harus sesuai dengan permintaan OP, tetapi gambaran lengkap persyaratan tidak diberikan sehingga menambahkan kode hanya untuk mencetak Pattern2(string RELOC_DIR) kemunculan pertama di sini.

awk '/RELOC_DIR/ && ++ count==1{print}'  Input_file
RELOC_DIR = /i/j/k/l/m

ATAU

awk '!found2 && /RELOC_DIR/ { t[2]=$0; found2=1; print}' Input_file
2
RavinderSingh13 14 Maret 2019, 03:11