Saya memiliki kode di bawah ini.

awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="lineNum" 'NR==lineNum{gsub(bookName, newTitle)}1'

Kode ini pada dasarnya memperbarui judul buku ke judul baru. lineNum berisi nilai nomor baris yang telah disetel tetapi kodenya tidak ditampilkan di sini.

Saya ingin baris kode ini mengabaikan kasus bookName, tetapi kode berikut yang saya coba tidak berfungsi.

awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="$lineNum" 'BEGIN{IGNORECASE=1} NR==lineNum{gsub(bookName, newTitle)}1'

Mengapa begitu?

Edit berdasarkan balasan John

* Edit Terbaru: Jadi pada dasarnya kode saya adalah seperti di bawah ini:

read -r bookName
read -r authorName

if grep -iqx "$bookName:$authorName" cutText.txt
then
lineNum=`awk -F":" -v bookName="$bookName" 'BEGIN{IGNORECASE=1} $0 ~ bookName ":" authorName {print NR}' BookDB.txt`

echo $lineNum
else
echo "Failed"
fi

CutText.txt berisi:

Hairy Potter:Rihanna
MARY IS A LITTLE LAMB:Kenny
Sing along:May

BookDB.txt berisi:

Hairy Potter:Rihanna:2:5:20
MARY IS A LITTLE LAMB:Kenny:39:2:1
Sing along:May:38:2:48

Jika saya memasukkan "Mary is a little lamb" sebagai bookName dan "Kenny" sebagai authorName, program seharusnya menampilkan 2. Namun, $lineNum tidak menghasilkan output apa pun.

0
JamesPoppycock 12 Agustus 2016, 08:12
1
Setelah mengganti -v lineNum="lineNum" dengan -v lineNum="$lineNum", itu berfungsi dengan baik untuk saya.
 – 
John1024
12 Agustus 2016, 08:20
2
Bekerja4me. Jika tidak berhasil untuk Anda, tunjukkan beberapa contoh input dan output untuk menunjukkan masalah apa yang Anda alami. Ide umumnya adalah bahwa pertanyaan harus berisi contoh Minimal, Lengkap, dan Dapat Diverifikasi. Sejauh ini, pertanyaan ini tidak lengkap atau dapat diverifikasi.
 – 
John1024
12 Agustus 2016, 08:29
1
Hei John! Saya minta maaf untuk pertanyaan yang tidak jelas. Setelah melihat dari dekat kode saya yang tidak ada dalam pertanyaan di atas, saya menyadari lineNum tidak mencetak NR, sehingga kode yang saya posting di pertanyaan tidak berfungsi. Kode ditunjukkan di bawah ini: lineNum=`awk -v bookName="$bookName" -v authorName="$authorName" ' BEGIN{IGNORECASE=1} $0 ~ bookName ":" authorName {print NR}' BookDB.txt` Ketika saya mencoba menggemakan $lineNum, tidak ada yang tercetak. Saya kira ini adalah akar masalahnya.
 – 
JamesPoppycock
12 Agustus 2016, 08:42
1
Tolong tunjukkan singkat kecuali file input Anda (bagian yang cukup panjang untuk menggambarkan masalah). Juga, berikan nilai apa pun untuk bookName, authorName, dll yang mungkin diperlukan untuk mereproduksi masalah.
 – 
John1024
12 Agustus 2016, 09:18
2
Pastikan Anda menggunakan gawk. IGNORECASE adalah bawaan khusus gawk.
 – 
jas
12 Agustus 2016, 16:12

1 menjawab

Jawaban Terbaik

IGNORECASE adalah spesifik gawk, Anda tidak boleh menggunakan gawk. portabel:

awk ... '
    NR==lineNum {
        if ( match(tolower($0),tolower(bookName)) ) {
            $0 = substr($0,1,RSTART-1) newTitle substr($0,RSTART+RLENGTH)
        }
        print
    }
'

Tetapi Anda benar-benar harus memulai kembali dengan seluruh skrip Anda karena campuran Shell+grep dan menggunakan awk untuk mendapatkan nomor baris hanyalah pendekatan yang salah. Posting pertanyaan baru untuk bantuan tentang cara menulis skrip Anda dengan benar.

1
Ed Morton 12 Agustus 2016, 17:55