Saya memiliki file input FILE1.TXT seperti di bawah ini.
11 id1
12
13 AGE = 20
14 NAME = NAME1
15
16 id2
17
18 AGE = 30
19 NAME = NAME2
.
.
.
110 idXYZ
111
112 AGE = AGEXYZ
113 NAME = NAMEXYZ
114
115 idZZZ
116
Saya ingin mencari semua bidang yang memiliki ID tertentu dan mendapatkan nilai untuk NAME
Saya berhasil mengulang setiap Id dan membentuk perintah di bawah ini untuk setiap Id sebagaimana diperlukan.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'
Masalahnya di sini adalah, saya mendapatkan output NAME1 , selain itu, saya juga mendapatkan NAMEXYZ .
Apa yang harus diubah sehingga saya hanya mendapatkan NAME1 tetapi tidak NAMEXYZ ?
Sebagai solusinya, perintah di bawah ini berfungsi.
sed -n '/11/,/14/p' FILE1.TXT | grep NAME | awk -F "= " '{print $2}'|head -1
Apakah ada 'saklar' atau saya kehilangan sesuatu?
^(random no of spaces)11
?sed -n '/^\s*11 /,/^\s*14 /p'
sed -n '/^11 /,/^14 /p' | awk '/NAME/{print $NF}'
apakah Anda sudah mencoba ini?Gunakan batas kata:
akan cocok
NAME1
dan tidakNAME1XYZ
atauXYZNAME1
.Demikian pula,
tidak akan cocok dengan baris yang berisi
111
dan142
.EDIT: Tampaknya angka-angka dalam file input sebenarnya nomor baris. Jika itu masalahnya, Anda bisa mengatakan:
untuk mendapatkan garis yang diinginkan.
sumber
NAME
antara baris 11 dan 14. Jadi, mengapased
melihat111
dan114
? Bagaimana membuatnya tidak terlihat di antara111
dan114
?sed
ekspresi.grep
dengan-w
bendera? bukan?-w
akan setara. Sebagaised
contoh,-w
sedikit berbeda.Anda bisa menggunakan AWK
Ini akan mencari garis antara 13 hingga 17 kemudian mencari Nama dan jika cocok maka akan mencetak kata terakhir dari
Name = LastWord
sumber
$
sebelumNR
dan itu menyebabkan kesalahan.Anda tidak memerlukan alat lain untuk ini,
sed
akan dengan mudah menanganinya secara keseluruhan.Itu seharusnya memberi Anda hanya urutan pertama karakter non-spasi putih mengikuti frasa "NAME =" untuk setiap baris tempat frasa itu ditemukan di antara baris 11 dan 14 dari setiap file input
sed
yang diumpankan.sumber
sed bukan alat yang tepat untuk pekerjaan ini. Gunakan awk di mana Anda dapat menentukan id yang Anda cari dan mencetak NAME berikutnya yang muncul.
sumber
versi generik tidak didasarkan pada nomor baris tetapi referensi id
sumber
Anda dapat mencetak garis-garis yang berisi pola yang cocok menggunakan sed sebagai berikut:
-n
- opsi ini menonaktifkan pencetakan otomatis ini, dan sed hanya menghasilkan output ketika secara eksplisit disuruh melaluip
perintah.p
- cetaksumber