Gunakan variabel dalam fungsi subk

1

Semua, saya punya string dari mana saya ingin mengekstraksi substring. Masalahnya adalah bahwa posisi awal disimpan dalam variabel. AWK Sepertinya tidak mengenali variabel.

Ini kodenya

str="This is a test"  
s1="is"  
i=$(awk -v a="$str" -v b="$s1" 'BEGIN{print index(a,b)}')  
echo "$str" | awk '{print substr($0,$i)}'

Tetapi ini tidak berhasil. Bagaimana memaksa awk untuk mengenali i?

merokok
sumber

Jawaban:

1

Dengan bash :

awk -v value="$i" '{print substr($0,value)}' <<< "$str"
Pangeran John Wesley
sumber
1

Variabel tidak diteruskan awk. Dari pada

echo "$str" | awk '{print substr($0,$i)}'

melakukan

echo $str | awk -v i="$i" '{print substr($0,i)}'

Namun, hasilnya adalah

% ./a.sh
is is a test

Apa output yang Anda inginkan?

Jin
sumber
Saya ingin hasilnya menjadi "adalah ujian"
smokinguns
1

Mengapa tidak melakukan semua proses dalam satu permintaan awk?

haystack="This is a test"
needle="is"
printf '%s\n' "$haystack" | awk -v "needle=$needle" '{\
    i=index($0, needle)
    if (i) print substr($0, i)
}

Jika Anda membutuhkan skrip shell Anda untuk juga melihat nilai i, Anda bisa menambahkan > "/dev/tty"ke akhir printperintah di atas, lalu menambahkan baris lain yang mengatakan hanya print itanpa redirect, kemudian bungkus seluruh printf ... | awk ...baris dalam sebuah i=$(...)konstruk.

dubiousjim
sumber
0

Jawaban langsung ke pertanyaan awal: dengan menghindari tanda kutip dan membiarkan shell memperluas variabel:

awk '{print substr($0,'$i')}'

Jika diduga bahwa variabel tersebut mungkin berisi ruang kosong dan hal-hal lain dan seseorang ingin itu diperlakukan sebagai string dalam awk, seseorang hanya dapat menggunakan lebih banyak tanda kutip:

awk '{print index($0,"'"$s1"'")}'

... tapi seseorang sering melakukan sesuatu yang kurang optimal jika sampai pada ini :-).

Daniel Andersson
sumber